constexpr函数是一个函数,如果使用constexpr参数进行评估,并且在其执行期间表现“正确”,将在编译时评估。 如果您将非constexprint传递给constexpr函数,它不会神奇地使其在编译时进行评估。但是,它将被允许通过自身传递其输入参数的constexpr(普通函数不能这样做)。 constexpr函数是文档和对它们的编写方式的限制以及对...
constexpr int MeaningOfLife = complex_initialization(1234, 5678, "hello"); 请注意,正是 左侧 的constexpr 强制保证提供 constexpr 它存在的理由。当然,确保 右侧 实际上可以在编译时进行评估取决于您,重要的是,仅声明一个函数 constexpr 本身并不会这样做。 因此,您的问题的 constexpr 是,当您需要或...
constexpr 函数“function”不能生成常数表达式 函数function 无法在编译时计算为 constexpr。 若要为 constexpr,函数只能调用其他 constexpr 函数。 示例 当条件性计算运算的左侧操作数在 constexpr 上下文中无效时,Visual Studio 2017 会正确引发错误。 下列代码在 Visual Studio 2015 中进行编译,但不在 Visual ...
struct Foo{intconst_member_function() const {returnm_data; }intnon_const_member_function(intdata) { m_data = data; }intm_data;};intmain(){const Foo* f = new Foo;f->const_member_function(); //OKf->non_const_member_function(); //compile ERRORreturn0;} 1. 2. 3. 4. 5. 6....
constexpr函数在调用时若传入的实参值是由编译期已知的,则会产出编译期结果; 比起非constexpr对象或constexpr函数而言,constexpr对象或是constexpr函数可以用在一个作用域更广的语境中。
本部分总结:C 中const的语义是保证物理常量性,但通过mutable关键字可以支持一部分的逻辑常量性。 const修饰变量 如上节所述,用const修饰变量的语义是要求编译器去阻止所有对该变量的赋值行为。因此,必须在const变量初始化时就提供给它初值: 1 2 3 constinti; ...
“function”:调用不会生成常数表达式 声明为 constexpr 的函数只能调用声明为 constexpr 的其他函数。 下面的示例生成 C2134: C++ // C2134.cpp// compile with: /cintA(){return42; };constexprintB(){returnA();// Error C2134: 'A': call does not result in a constant expression.} ...
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的...
constexprintdata(){constinti=1;//含有除了return以外的语句returni; } 在c++11中是无法通过编译的。 但使用不会产生实际代码的语句是可以的,例如static_assert() 2. 函数必须返回值 例如constexpr void f(){}无法通过编译的,因为无法获得常量的常量表达式是不被认可的。
C/C++ 中的常量、#define、const和constexpr提供了不同的常量管理方式,它们在内存管理、类型安全、编译时计算等方面各具特色。- 常量:代表固定不变的值,类型明确,值不可修改,如整型、浮点数等。const和constexpr都允许在编译时初始化,但constexpr要求必须在编译时计算其值。- #define:预处理器宏...