精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C++ 面試題:C++中 constexpr 函數的限制有哪些?

開發
在 C++ 中,字面類型(Literal Type) 是指可以在編譯期確定其值的類型,是支持編譯期計算的基礎。

注意這道面試題,問的不是 constexpr 的用法,是限制有哪些?

一、基本限制

參數和返回類型必須是字面類型。

我們理解下什么是字面類型?

在 C++ 中,字面類型(Literal Type) 是指可以在編譯期確定其值的類型,是支持編譯期計算的基礎。

1. C++ 標準規定,以下類型屬于字面類型:

(1) 基本類型

int, char, bool, float, double, long, short, unsigned 等。

nullptr_t(C++11 起)。

constexpr int x = 42;  // int 是字面類型
constexpr char c = 'A'; // char 是字面類型

(2) 引用類型

引用必須綁定到字面類型。

constexpr int a = 10;
constexpr const int& ref = a;  // 引用是字面類型

(3) 數組類型

數組的元素必須是字面類型。

constexpr int arr[] = {1, 2, 3};  // int[] 是字面類型

(4) 字面值類(Literal Class)

類的所有非靜態成員必須是字面類型。

必須有一個 constexpr 構造函數(可以是默認構造函數或帶參數的構造函數)。

不能有虛函數。(C++20允許字面類型包含虛函數,但是需要滿足不少條件)

struct Point {  // 字面值類
    int x, y;
    constexpr Point(int x = 0, int y = 0) : x(x), y(y) {}  // constexpr 構造函數
};
constexpr Point p(1, 2);  // 編譯期構造

(5) void(C++14 起)

void 也可以算作字面類型,但通常不能直接用于 constexpr 變量。

(6) 標準庫中的某些類型

std::array(如果 T 是字面類型)。

std::string_view(C++17 起)。

#include <array>
constexpr std::array<int, 3> arr = {1, 2, 3};  // std::array 是字面類型

constexpr std::string_view sv = "compile-time"; // 合法,數據是編譯期字面量
// constexpr std::string_view sv2 = std::string("runtime"); // 錯誤:非編譯期數據

std::string("runtime") 會創建一個臨時 std::string 對象,它的底層數據(存儲字符的數組)在內存中的生命周期僅限于當前表達式。當這行代碼執行完畢時,臨時對象會被銷毀,其底層數據也隨之失效。

std::string("runtime") 生成的臨時對象在編譯期上下文中仍然會“邏輯銷毀”,導致 string_view 引用的底層數據在編譯期就失效。

這里最關鍵的就是數據來源的編譯期確定性!

2. 非字面類型的例子

以下類型不是字面類型,因此不能用于 constexpr 上下文:

  • std::string(因為它的動態內存分配不能在編譯期確定)。
  • 帶有虛函數的類(C++20 之前)。
  • 包含非字面類型成員的類。
struct NonLiteral {
    std::string s;  // std::string 不是字面類型
    NonLiteral() {}  // 沒有 constexpr 構造函數
};
// constexpr NonLiteral nl;  // 錯誤:NonLiteral 不是字面類型

3. 為什么 constexpr 限制要求字面類型?

constexpr 的核心目標是編譯期計算,因此:

  • 編譯期可構造:字面類型的對象可以在編譯期初始化。
  • 編譯期可求值:constexpr 函數的參數和返回值必須是編譯期可確定的。
  • 避免運行時依賴:非字面類型(如 std::string)可能涉及動態內存分配,無法在編譯期處理。

二、禁止的操作

以下操作在 constexpr 函數中不允許出現:

1. 動態內存分配

用new/delete 或堆內存操作。

constexpr int* invalid() {
    int* p = new int(42); // 錯誤:不能在編譯時分配內存
    return p;
}

2. 異常處理

不能使用 throw 或 try-catch。

constexpr int unsafe(int a) {
    if (a < 0) throw "negative"; // 錯誤:不允許異常
    return a;
}

3. 調用非 constexpr 函數

只能調用其他 constexpr 函數或編譯器內建函數

int non_constexpr(int x) { return x; }

constexpr int invalid_call(int x) {
    return non_constexpr(x); // 錯誤:調用了非 constexpr 函數
}

4. 修改全局/靜態變量

編譯時上下文無法處理副作用。

全局變量:在程序啟動時(main() 之前)初始化。

靜態變量:

  • 局部 static 變量在第一次進入作用域時初始化(運行時)。
  • 全局 static 變量類似于全局變量。

由于它們的初始化可能依賴運行時狀態,constexpr 無法保證編譯期確定性。

int global = 0;
constexpr void modify_global() {
    global++; // 錯誤:修改全局變量
}

C++標準規定,constexpr函數中不能包含對具有靜態存儲期變量的賦值或修改操作。

三、成員函數的特殊規則

1. 虛函數

  • C++20 前:虛函數不能是 constexpr。
  • C++20 起:允許虛函數為 constexpr。
struct Base {
    virtual constexpr int foo() { return 1; } // C++20 合法
};

2. 隱式 const 限定(C++11)

  • C++11:constexpr 成員函數隱式為 const。
  • C++14:取消此限制,允許修改對象狀態。
struct Widget {
    int value = 0;
    constexpr void update() { value++; } // C++14+ 合法
};

這里其實開始不是很理解,成員變量的修改其實是運行時行為,但是現在要在編譯期搞,查了下資料是這么說的:

constexpr成員函數修改成員變量,在編譯期是邏輯行為,運行時才是真實修改
。是邏輯上的(編譯器模擬,不生成實際的內存寫入)。

我理解是:

  • 對 value 的修改發生在編譯期,最終生成的 value 是一個編譯期常量對象,其狀態被“凍結”為 count = 1。
  • 沒有運行時開銷,value 的值直接編譯進二進制。
  • 這里的“修改”只是邏輯上的操作,不涉及真實內存寫入。
  • 運行時調用 update() 是真正的運行時行為,修改的是內存中的對象。
  • 代碼邏輯與編譯期版本相同,但發生在程序運行時。
  • 對比上面說的全局變量,類成員變量的對象是局部的影響可控,全局變量可能被其他地方修改,所以類成員變量這里可以放開,但是全局變量不行。

四、遞歸深度限制

即使遞歸邏輯合法,編譯器對 constexpr 遞歸深度有默認限制(如 GCC 默認 512 層)。超出限制時需通過編譯選項調整:

g++ -fconstexpr-depth=1000 main.cpp

五、版本差異總結

特性

C++11

C++14+

C++20

函數體復雜度

單條

允許循環、變量

進一步擴展

虛函數支持

不支持

不支持

支持

成員函數隱式

示例:合法與非法用法對比

// 合法:C++14+ 允許循環和局部變量
constexprintsum(int n){
    int total = 0;
    for (int i = 0; i < n; ++i) {
        total += i;
    }
    return total;
}

// 非法:動態內存分配
constexprint* create(){
    int* p = newint(10);
    return p;
}

// 合法:C++20 虛函數
structBase {
    virtualconstexprintget(){ return1; }
};


責任編輯:趙寧寧 來源: CppPlayer
相關推薦

2025-05-20 10:00:00

C++命名空間別名代碼

2025-05-20 08:10:00

函數函數類型函數指針類型

2021-10-27 11:00:30

C++語言面試

2010-01-27 17:16:52

C++構造函數

2024-02-21 23:13:45

C++編程開發

2010-01-26 10:42:26

C++函數

2023-10-08 08:48:38

C++constexpr

2010-01-19 13:43:59

C++函數

2025-05-26 03:20:00

2025-08-19 09:30:34

2011-03-29 14:31:41

CC++

2025-05-27 10:15:00

void*函數開發

2025-04-30 10:10:00

在 C++C++11Lambda

2010-01-27 16:05:06

C++堆棧

2010-01-21 09:34:57

C++語法

2010-01-21 14:07:14

CC++聲明

2025-05-06 08:20:00

互斥鎖C++編程

2025-05-09 09:25:00

2010-01-28 16:31:54

C++類型

2010-01-25 10:25:19

C++變量
點贊
收藏

51CTO技術棧公眾號

一本色道久久综合狠狠躁的番外| 理论片午午伦夜理片在线播放| 尤物精品在线| 亚洲人成电影网站色xx| 日本中文字幕高清| 成人看片免费| 久久综合色之久久综合| 国产精品视频导航| 在线看成人av| 日本成人小视频| 亚洲成人免费在线视频| 麻豆传传媒久久久爱| 国产黄大片在线观看画质优化| 白白色 亚洲乱淫| 国产精品综合不卡av| 日本特黄特色aaa大片免费| 精品国产aⅴ| 精品欧美乱码久久久久久| 日韩精品一区二区三区不卡| 亚洲性图自拍| 国产精品少妇自拍| 九九九热999| 国产高清不卡视频| 久久国产欧美| 97久久精品人人澡人人爽缅北| 国产主播av在线| 一区二区三区韩国免费中文网站| 日韩一区二区三免费高清| 99草草国产熟女视频在线| 成年网站在线视频网站| 成人欧美一区二区三区视频网页| 欧美xxxx黑人又粗又长精品| 亚洲精品97久久中文字幕| 久久99在线观看| 国产成人久久精品| 91视频免费网址| 激情一区二区| 欧美激情va永久在线播放| 纪美影视在线观看电视版使用方法| 九九热播视频在线精品6| 9191久久久久久久久久久| 久久精品视频91| 欧美大片免费高清观看| 午夜伦理一区二区| 免费人成自慰网站| 丝袜中文在线| 亚洲综合色成人| 日本a级片在线观看| 日本在线视频站| 国产精品久久久久久久裸模| 蜜桃传媒视频麻豆第一区免费观看 | 日韩欧美黄色大片| 成人免费影院| 在线观看区一区二| 玩弄japan白嫩少妇hd| 爱情电影社保片一区| 福利微拍一区二区| 欧美性大战久久久久xxx| 色偷偷色偷偷色偷偷在线视频| 亚洲国产日韩一级| 国产3p露脸普通话对白| 蜜桃视频在线网站| 欧美性猛交xxxx乱大交| 国产v亚洲v天堂无码久久久| 国产综合色在线观看| 在线欧美一区二区| 亚洲精品性视频| 精品国产伦一区二区三区观看说明 | 久久亚洲影音av资源网| 欧美片一区二区| 亚洲人成在线影院| 青青草原成人在线视频| 香蕉污视频在线观看| 蜜臀av一区二区| 91精品在线一区| 亚洲精品国产suv一区| heyzo一本久久综合| 欧美污视频久久久| 日本中文字幕视频在线| 一区二区三区欧美久久| 青青草成人免费在线视频| 成人香蕉视频| 欧美剧情片在线观看| 欧美精品色视频| 欧美深夜视频| 中文在线不卡视频| 久久综合成人网| 久久久久久黄| 91沈先生在线观看| 深夜福利在线视频| 国产精品丝袜91| 久久人人爽人人爽人人av| 亚洲免费福利| 日韩一区和二区| 欧美狂猛xxxxx乱大交3| 91精品一区二区三区综合在线爱| 久久欧美在线电影| 国产精品无码粉嫩小泬| 国产91综合网| 五月天婷亚洲天综合网鲁鲁鲁| 天堂地址在线www| 五月综合激情日本mⅴ| 国产高清视频网站| 国产精品高潮呻吟久久久久| 国产亚洲视频在线| 国产精品第九页| 久久国产三级精品| 裸模一区二区三区免费| 成人免费高清| 欧美日韩情趣电影| 午夜一区二区三区免费| 亚洲理论电影网| 国产精品成人一区| 欧美少妇bbw| 亚洲欧美激情一区二区| 香港三级韩国三级日本三级| 高清一区二区| 中文字幕日韩欧美| 五月婷婷视频在线| 国产成人免费网站| www亚洲国产| 日本一区二区电影| 日韩成人在线视频| 久草网站在线观看| 久久国内精品视频| 手机成人在线| 韩国美女久久| 日韩av在线一区二区| 欧美日韩精品亚洲精品| 精品中文字幕一区二区| 欧美在线视频二区| 日本乱码一区二区三区不卡| 日韩女优制服丝袜电影| 国产黄色小视频网站| 七七婷婷婷婷精品国产| 欧美亚洲精品日韩| 亚洲一本二本| 91精品国产色综合久久久蜜香臀| 亚洲黄色免费视频| 午夜在线一区二区| 精品国产乱码久久久久久88av| 在线观看小视频| 欧美精品乱人伦久久久久久| 91麻豆制片厂| 蜜臀av一区二区三区| 日韩亚洲视频在线| 欧美韩国亚洲| 国产亚洲视频中文字幕视频| 欧美性猛交bbbbb精品| 2020国产成人综合网| 97国产精东麻豆人妻电影| 欧美人体视频| 青青草一区二区| 成人影视在线播放| 欧美午夜影院一区| 91大神福利视频| 国产综合色在线视频区| 激情图片qvod| 国产成人精品亚洲线观看| 欧美激情一级二级| 天天操天天舔天天干| 懂色av中文一区二区三区天美| 国产美女视频免费观看下载软件| 一道本一区二区| 日本在线观看一区| 国产欧美自拍| 免费97视频在线精品国自产拍| 国产高清免费观看| 精品久久久久久久久久久久久久| 少妇光屁股影院| 蜜桃视频第一区免费观看| 中文字幕日韩精品久久| 日韩在线成人| 26uuu亚洲国产精品| 国产69精品久久app免费版| 欧美久久久久久蜜桃| 人妻少妇精品一区二区三区| www.在线成人| 亚洲最大成人在线观看| 一区二区三区在线电影| 精品综合久久久| 国产69精品久久| 欧美激情视频网| 韩日视频在线| 欧美一级日韩不卡播放免费| 日韩男人的天堂| 欧美激情中文不卡| 国产性猛交96| 天堂成人免费av电影一区| 欧美一级免费在线观看| 免费看久久久| 国产有码一区二区| 99riav视频在线观看| 中文欧美日本在线资源| 蜜桃av中文字幕| 欧美日韩视频在线观看一区二区三区 | 成人精品视频一区二区三区| 97在线免费公开视频| 国产精品成人av| 精品伊人久久大线蕉色首页| 亚洲精品成a人ⅴ香蕉片| 97色在线播放视频| 免费大片在线观看www| 亚洲激情视频在线| 国产强被迫伦姧在线观看无码| 亚欧色一区w666天堂| 成人性视频免费看| 99re热视频精品| 永久av免费在线观看| 三级欧美韩日大片在线看| 国产天堂视频在线观看| 久久在线播放| 青青草成人激情在线| 6080成人| 91嫩草在线视频| 精品免费av在线| 51色欧美片视频在线观看| 在线中文免费视频| y97精品国产97久久久久久| 人成免费电影一二三区在线观看| 日韩一区二区三区在线观看 | 丝袜a∨在线一区二区三区不卡| 国产精品av免费观看| 久久国产电影| 日韩不卡av| 亚洲人成网亚洲欧洲无码| 国产富婆一区二区三区| 国产视频网站一区二区三区| 国产精品直播网红| 日韩在线免费| 国产成一区二区| 成人软件在线观看| 日本aⅴ大伊香蕉精品视频| av影片在线| 国模极品一区二区三区| 日韩精品分区| 久久99精品久久久久久琪琪| 美女av在线播放| 中文字幕在线成人| 91精品国产91久久久久游泳池| 日韩精品久久久久久福利| 人妻少妇精品无码专区久久| 日韩精品资源二区在线| a天堂视频在线| 日韩一区二区三免费高清| h狠狠躁死你h高h| 日韩一区二区电影| 99热这里精品| 日韩欧美一区二区三区在线| 国产成人av免费看| 精品美女一区二区| 日韩在线视频第一页| 亚洲精品国产美女| 香蕉视频911| 亚洲精品在线观看www| 欧洲亚洲在线| 国产一区二区三区直播精品电影| 国产精品99999| 最近2019年好看中文字幕视频| 免费大片黄在线| 欧美另类xxx| 国产精品一二三产区| 欧洲永久精品大片ww免费漫画| 欧美电影网站| 国产欧美精品一区二区三区介绍| 日韩欧美三区| ts人妖另类在线| 日韩av影院| 色一情一乱一伦一区二区三区| 精品久久综合| 一本二本三本亚洲码| 欧美久久综合| 日本免费黄视频| 另类专区欧美蜜桃臀第一页| 国产xxxxhd| 99视频热这里只有精品免费| 人妻少妇无码精品视频区| 国产精品久久久久久亚洲伦| 久久久久久久久久久网| 欧美日韩一区二区三区| 天堂免费在线视频| 日韩欧美在线123| 欧美91精品久久久久国产性生爱| 一区二区三区动漫| 日本无删减在线| 国产经典一区二区| 久久久精品区| 日本视频精品一区| 欧美影院一区| 国产三级三级三级看三级| 国产一区二区不卡| 黑人巨大精品欧美| 亚洲欧洲制服丝袜| 天堂中文在线网| 3d成人动漫网站| 久色视频在线| 欧美激情网站在线观看| 三上悠亚国产精品一区二区三区| 亚洲www视频| 欧美日韩伦理| 精品无码国产一区二区三区av| 奇米四色…亚洲| 一出一进一爽一粗一大视频| 最近日韩中文字幕| 老熟妇仑乱一区二区av| 日韩欧美一级在线播放| 成人免费视频| 国产91对白在线播放| 国产一区二区三区免费在线 | 一本久久a久久精品亚洲| 国产人妖一区二区三区| 亚洲免费人成在线视频观看| 羞羞视频在线免费国产| 国产精品爽爽爽| 一区二区三区韩国免费中文网站| www.好吊操| 国产一区在线观看视频| 九九热免费在线| 色婷婷综合久久久久中文| 好吊色一区二区| 免费不卡在线观看av| 欧美男女视频| 婷婷精品国产一区二区三区日韩| 国产精品美女久久久浪潮软件| 国产探花一区二区三区| 亚洲人成精品久久久久久 | 国产在线美女| 国产精品日韩一区二区| 欧美一区影院| 人妻巨大乳一二三区| 亚洲美女视频在线| 97人妻精品一区二区三区| 一个人看的www久久| 午夜精品成人av| 日本视频精品一区| 久久天堂精品| 欧美日韩高清丝袜| 日韩欧美有码在线| 你懂的免费在线观看视频网站| 97在线观看视频| 任你弄精品视频免费观看| 日韩 欧美 视频| 懂色av一区二区夜夜嗨| 精品无码人妻一区二区三| 欧美一区二区三区不卡| 超碰人人在线| 99久久国产免费免费| 中文字幕午夜精品一区二区三区 | 久久精品一区四区| 少妇高潮av久久久久久| 亚洲人成电影网站色xx| 素人啪啪色综合| 亚洲三区在线| 国产一区在线视频| 国产亚洲成人精品| 亚洲激情成人网| 欧美成人精品三级网站| 日韩欧美一区二区三区四区 | 国产日韩精品在线播放| 国产电影一区二区在线观看| 污视频在线观看免费网站| 亚洲欧洲中文日韩久久av乱码| 性一交一乱一透一a级| 午夜精品理论片| 羞羞色国产精品网站| 黄色免费网址大全| 亚洲天堂福利av| 国产强伦人妻毛片| 97在线观看免费高清| 激情综合网五月| 久久久久久久久久一区| 亚洲最新视频在线播放| 三区在线观看| 国产欧美日韩免费| 欧美精品网站| 久久精品国产亚洲av麻豆| 欧美午夜一区二区| 91精品久久| 欧美日韩视频在线一区二区观看视频| 日本在线不卡视频| 欧美成人三级在线观看| 亚洲精品视频在线观看视频| 香蕉久久久久久| 好吊妞无缓冲视频观看| 中文字幕欧美日韩一区| а√天堂资源在线| 国产成人精品综合久久久| 欧美激情第10页| 受虐m奴xxx在线观看| 欧美一级日韩一级| 日韩国产激情| 久久www视频| 欧美激情一区二区三区不卡| 国产av一区二区三区精品| 琪琪第一精品导航| 欧美91福利在线观看| 久久av无码精品人妻系列试探| 日韩久久精品一区| 69堂精品视频在线播放| 97超碰在线人人|