3 回答
TA贡献1827条经验 获得超9个赞
基本意义和句法
const
声明对象为 常量..这意味着,一旦初始化,该对象的值就不会改变,编译器可以利用这一事实进行优化。它还有助于防止程序员编写修改初始化后不打算修改的对象的代码。 constexpr
声明一个适合在标准调用的对象中使用的对象 常数表达式..但请注意 constexpr
不是唯一的办法。
const
只能用于非静态成员函数,一般不能用于函数.它保证成员函数不会修改任何非静态数据成员。 constexpr
既可用于成员函数,也可用于非成员函数,也可用于构造函数。它声明该函数适合用于 常数表达式..只有当函数满足某些条件(7.1.5/3,4)时,编译器才会接受它,最重要的是 (†) :函数体必须是非虚拟的,并且非常简单:除了类型防御和静态断言之外,只有一个 return
允许陈述。在构造函数的情况下,只允许初始化列表、类型防御和静态断言。( = default
和 = delete
但也是允许的。) 从C+14开始,规则就更宽松了,从那时起,在一个函数中允许这样做: asm
声明,a goto
语句,具有其他标签的语句。 case
和 default
、尝试块、非文字类型变量的定义、静态或线程存储持续时间变量的定义、未对其执行初始化的变量的定义。 参数和返回类型必须为 文字类型
(一般来说,非常简单的类型,通常是标量或集合)
常数表达式
constexpr
它可以用于需要编译时评估的地方,例如模板参数和数组大小说明符: template<int N>class fixed_size_list{ /*...*/ };fixed_size_list<X> mylist; // X must be an integer constant expressionint numbers[X]; // X must be an integer constant expression
但请注意: 这是可能的,因为 N
,它是常量,并且在声明时使用文字初始化,它满足常量表达式的条件,即使它没有声明。 constexpr
.宣布某事为 constexpr
并不一定能保证在编译时对其进行评估。它 可以使用对于这种情况,也可以在运行时对其进行评估的其他地方使用。 对象 可以,可能适合在常量表达式中使用 无被宣布 constexpr
..例子: int main(){ const int N = 3; int numbers[N] = {1, 2, 3}; // N is constant expression}
constexpr
?
阿 对象喜欢 N
以上可用作常量表达式。 无被宣布 constexpr
..以下所有对象都是如此: [这是由于第5.19/2节:常数表达式不得包括涉及“lvalue-rvalue修改”的子表达式,除非[…]是整数类型或枚举类型的极值[…]。感谢理查德·史密斯纠正了我先前关于所有文字类型都是如此的说法。] const
整数型或计数型 和
在声明时使用本身是常量表达式的表达式初始化 为了 功能为了适合在常量表达式中使用,它 必明确声明 constexpr
它仅仅满足常数表达式函数的准则是不够的.例子: template<int N>class list{ };constexpr int sqr1(int arg){ return arg * arg; }int sqr2(int arg) { return arg * arg; }int main(){ const int X = 2; list<sqr1(X)> mylist1; // OK: sqr1 is constexpr list<sqr2(X)> mylist2; // wrong: sqr2 is not constexpr}
const
constexpr
A.在目标声明中。constexpr
const
.
constexpr const int N = 5;
constexpr int N = 5;
static constexpr int N = 3;int main(){ constexpr const int *NP = &N;}
NP
constexpr
const
constexpr
NP
const
int
const
&N
B.成员职能声明。constexpr
const
constexpr void f();
constexpr void f() const;
const
- 3 回答
- 0 关注
- 436 浏览
添加回答
举报