1. 解释“constexpr”关键字的作用和限制 constexpr 是C++11 引入的一个关键字,用于指定函数或变量可以在编译时求值。使用 constexpr 的函数和变量必须是常量表达式,这意味着它们的值在编译时就已经确定,而不是在运行时。constexpr 的主要优点是允许编译器进行更深入的优化,因为它知道某些值的计算可以在编译时完成...
constexpr函数是一个函数,如果使用constexpr参数进行评估,并且在其执行期间表现“正确”,将在编译时评估。 如果您将非constexprint传递给constexpr函数,它不会神奇地使其在编译时进行评估。但是,它将被允许通过自身传递其输入参数的constexpr(普通函数不能这样做)。 constexpr函数是文档和对它们的编写方式的限制以及对...
constexpr 函数“function”不能生成常数表达式 函数function 无法在编译时计算为constexpr。 若要为constexpr,函数只能调用其他constexpr函数。 示例 当条件性计算运算的左侧操作数在constexpr上下文中无效时,Visual Studio 2017 会正确引发错误。 下列代码在 Visual Studio 2015 中进行编译,但不在 Visual Studio 2017 ...
“function”:调用不会生成常数表达式 声明为 constexpr 的函数只能调用声明为 constexpr 的其他函数。 下面的示例生成 C2134: C++ // C2134.cpp// compile with: /cintA(){return42; };constexprintB(){returnA();// Error C2134: 'A': call does not result in a constant expression.} ...
// constexpr-function: constexpr int MeaningOfLife () { return 42; } 在我看来,如果我编写了一个返回文字值的函数,并且我进行了代码审查,那么有人会告诉我,我应该声明一个常量值而不是写 return 5。 假设它做了一些更复杂的事情。 constexpr int MeaningOfLife ( int a, int b ) { return a * ...
const struct Foo *f = new Foo;f->dataX = 100; //compile errorconstchar* p ="abc";p[1] ='x'; //compile errorf->nonconst_member_function(); ///compile error (后面再讲) 1. 2. 3. 4. 5. 6. [3] 修饰指针 T* const p:表示指针只能在初始化时设置指向,之后便不能修改指向。
本部分总结:C 中const的语义是保证物理常量性,但通过mutable关键字可以支持一部分的逻辑常量性。 const修饰变量 如上节所述,用const修饰变量的语义是要求编译器去阻止所有对该变量的赋值行为。因此,必须在const变量初始化时就提供给它初值: 1 2 3 constinti; ...
constexpr函数在调用时若传入的实参值是由编译期已知的,则会产出编译期结果; 比起非constexpr对象或constexpr函数而言,constexpr对象或是constexpr函数可以用在一个作用域更广的语境中。
编译器错误 C3615 constexpr 函数“function”不能生成常数表达式 编译器错误 C3616 已过时。 编译器错误 C3617 结构化绑定的初始值设定项必须是数组或非联合类类型;不允许使用“type_name”类型 编译器错误 C3618 “declaration”: 标记为 DllImport 的方法无法定义 编译器错误 C3619 不能在托管/ WinRT 类型中...
constexprfloatexp(floatx,intn){returnn==0?1:n%2==0?exp(x*x,n/2):exp(x*x,(n-1)/2)*x;} 修饰构造函数 constexpr还能用于修饰类的构造函数,即保证如果提供给该构造函数的参数都是constexpr,那么产生的对象中的所有成员都会是constexpr,该对象也就是constexpr对象了,可用于各种只能使用constexpr的...