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 之类的东西,没有太多意义。
答案 0 :(得分:6)
在功能正常的C ++ 11编译器上,您的代码将被拒绝。
基于它的被接受,你几乎肯定会使用gcc(或者一些非常接近模仿它的bug)。 gcc [在某种程度上取决于标志]可以接受任何度量不是常量的数组大小(例如,取决于用户的运行时输入),因为它们支持C ++中C99可变长度数组的模拟。
答案 1 :(得分:1)
编译器可以检测是否可以使用constexpr
声明某个函数,即使它们没有,也是优化目的(即计算编译时函数的结果)。编译器在C ++ 11之前就已经这样做了。
但是要在需要常量表达式的地方使用,例如整数类型的模板参数,允许调用未使用constexpr
关键字声明的函数是违反标准的。