7

C++11 编译器(他们是否)能注意到一个函数是一个constexpr并这样对待它们,即使它们没有被声明为constexpr

我正在使用直接来自维基百科的示例向某人演示constexpr的使用:

int get_five() {return 5;}

int some_value[get_five() + 7]; // Create an array of 12 integers. Ill-formed C++

令我惊讶的是,编译器可以接受。因此,我进一步更改了 get_five() 以获取一些 int 参数,将它们相乘并返回结果,同时仍未显式声明为constexpr。编译器也可以。似乎如果编译器可以做到这一点,那么为了显式声明constexpr所需的限制并没有多大意义。

4

2 回答 2

7

在正常运行的 C++11 编译器上,您的代码将被拒绝。

基于它被接受,您几乎可以肯定使用 gcc(或密切模仿其错误的东西)。gcc [在某种程度上取决于标志] 可以接受在任何情况下都不是恒定的数组大小(例如,取决于用户的运行时输入),因为它们支持 C++ 中的 C99 可变长度数组的模拟。

于 2013-04-01T19:03:49.727 回答
1

编译器可以检测函数是否可以被声明,constexpr即使它们没有声明,用于优化目的(即在编译时计算函数的结果)。编译器在 C++11 之前就这样做了。

constexpr但是在需要常量表达式的地方使用,例如整数类型的模板参数,允许调用未使用关键字声明的函数是违反标准的。

于 2013-04-01T19:11:23.943 回答