C++ 隐式constexpr?

C++ 隐式constexpr?,c++,c++11,constexpr,C++,C++11,Constexpr,C++11编译器(以及它们)是否能注意到函数是constexpr,并将它们视为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()以获

C++11编译器(以及它们)是否能注意到函数是constexpr,并将它们视为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所需的限制就没有多大意义了

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

基于它被接受,您几乎可以肯定使用的是gcc(或者类似于它的bug的东西)。GCC(取决于标记)可以接受任何大小不恒定的数组大小(例如,依赖于用户的运行时输入),因为它们支持C++中的C99可变长度数组的模拟。

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


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

可能您的编译器支持VLA作为扩展。你有没有考虑过?是什么编译器?我正在使用的可能的副本,我使用的是明文-4.61的G++,还使用了-STD= C++ 0x和学究式交换机。根据下面JC的回答,我正在考虑安装Clang@Bo-我在讨论GETXPR PR关键字,它是在GETHE5()的声明中所需要的。@ ARBALEST——我知道没有隐含的CONTXPR,但是Jerry Coffin在G++下面回答(取决于精确的选项集)也允许C++中使用了一些C99特征。<代码> G++< /COD> 4.63.4.7.2和4.8拒绝此项。至少在liveworkspace中version@icepack是的,我相信你可以得到它拒绝代码,如果你选择(但它接受VLAs在C++中默认)。@ iCePACK它不拒绝它当它在一个函数:-它确实发出警告,虽然!一定是这样。我通过MinGW-4.6.1使用g++,但也使用-std=c++0x和-pedantic开关。“编译器可以检测函数是否可以用constexpr声明”你有任何引用来备份它吗?@cseder我发现很难想象任何现代编译器都不会这么做。这是关于编译器如何工作的基本知识,这几乎不是证据。当你说“现代编译器”时,我想你排除了最新的Visual C++ 2013编译器,因为它不支持自动。constexpr只有在每次从constexpr函数返回的结果都相同的情况下才可用,因此不需要包含太多关于编译的知识。编译器还有其他方法来处理常量表达式。我只想知道你需要什么事实来支持你的语句。