隐含的constexpr?

时间:2013-04-01 19:01:11

标签: c++ c++11 constexpr

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 之类的东西,没有太多意义。

2 个答案:

答案 0 :(得分:6)

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

基于它的被接受,你几乎肯定会使用gcc(或者一些非常接近模仿它的bug)。 gcc [在某种程度上取决于标志]可以接受任何度量不是常量的数组大小(例如,取决于用户的运行时输入),因为它们支持C ++中C99可变长度数组的模拟。

答案 1 :(得分:1)

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

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