您好,登錄后才能下訂單哦!
constexpr 指定符聲明可以在編譯時求得函數或變量的值。然后這些變量和函數(若給定了合適的函數參數)可用于僅允許編譯時常量表達式之處。用于對象或非靜態成員函數 (C++14 前)聲明的 constexpr 指定符隱含 const 。用于函數聲明的 constexpr 指定符或 static 成員變量 (C++17 起)隱含 inline 。
constexpr 變量必須滿足下列要求:
其類型必須是字面類型 (LiteralType) 。
它必須被立即初始化
其初始化的完整表達式,包括所有隱式轉換、構造函數調用等,都必須是常量表達式
constexpr 函數必須滿足下列要求:
它必須非虛
(C++20 前)
其返回類型必須是字面類型 (LiteralType)
其每個參數都必須是字面類型 (LiteralType)
至少存在一組參數值,使得函數的一個調用能為被求值的核心常量表達式的子表達式(對于構造函數為足以用于常量初始化器) (C++14 起)。不要求對這點的診斷。
函數體必須是被刪除或被默認化,或只含有下列內容:
空語句(平凡分號)
static_assert 聲明
不定義類或枚舉的 typedef 聲明及別名聲明
using 聲明
using 指令
恰好一條 return 語句。
(C++14 前)
函數體必須是被刪除或被默認化,或含有下列內容外的任何語句:
asm 聲明
goto 語句
擁有異于 case 和 default 標號的語句
try 塊
非字面類型的變量定義
靜態或線程存儲期變量的定義
不進行初始化的變量定義。
(C++14 起)
constexpr 構造函數必須滿足下列要求:
其每個參數都必須是字面類型 (LiteralType) 。
該類不能有虛基類
該構造函數不可有函數 try 塊
構造函數體必須被刪除或被默認化或只含有下列內容:
空語句
static_assert 聲明
不定義類或枚舉的 typedef 聲明及別名聲明
using 聲明
using 指令
(C++14 前)
構造函數體的復合語句必須滿足 constexpr 函數體的限制
(C++14 起)
對于 class 或 struct 的構造函數,每個子對象和每個非變體非 static 數據成員必須被初始化。若類是類聯合體類,對于其每個非空匿名聯合體成員,必須恰好有一個變體成員被初始化
對于非空 union 的構造函數,恰好有一個非 static 數據成員被初始化
每個被選作初始化非 static 成員和基類的構造函數必須是 constexpr 構造函數。
對于 constexpr 函數模板和類模板的 constexpr 函數成員,必須至少有一個特化滿足上述要求。其他特化仍被認為是 constexpr ,盡管常量表達式中不能出現這種函數的調用。
```c++
//
// main.cpp
//
//
// Created by myhaspl on 2018/10/24.
// myhaspl@myhaspl.com.
//
#include <iostream>
using namespace std;
int bar(){return 0;}
constexpr int foo(int a)
{
if (a <=0 )
return bar();
else
return 1;
}
int main()
{
int a1[2]={0,1};
cout<<a1[foo(5)]<<endl;
cout<<a1[foo(-1)]<<endl;
}```
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。