C++ 据我所知,根据§;5.19/3和§;C+中的5.19/2+;14

C++ 据我所知,根据§;5.19/3和§;C+中的5.19/2+;14,c++,language-lawyer,c++14,constexpr,C++,Language Lawyer,C++14,Constexpr,但它是在GCC4.9.0中编译的。见: #包括 结构A{ constexpr A():i(5){} int&&f(){return std::move(i);} int i; }a; A&&f(A&A){return std::move(A);} int main(){ A A; intb[a.f()]{0,1,2,3,4}; STD::CUT< P>你是正确的, A.F.():/Cord>不是常数表达式。可变长度数组不允许由C++标准来实现。GNU编译器支持它们作为A。当使用非标准扩展时,可以

但它是在GCC4.9.0中编译的。见:

#包括
结构A{
constexpr A():i(5){}
int&&f(){return std::move(i);}
int i;
}a;
A&&f(A&A){return std::move(A);}
int main(){
A A;
intb[a.f()]{0,1,2,3,4};
STD::CUT< P>你是正确的,<代码> A.F.():/Cord>不是常数表达式。可变长度数组不允许由C++标准来实现。GNU编译器支持它们作为A。当使用非标准扩展时,可以要求编译器给你警告,或者使用“代码错误>学究错误

编辑:显然,GCC 4.9是对向C++14标准中添加可变长度数组的建议的官方支持。最终,该建议未包含在标准中,但GCC 4.9在C++14之前发布,因此没有反映出更改。因此,在C++14模式下,GCC 4.9有意支持VLA,并且上述选项没有禁用注意,C++14模式仍然是实验性的(即使在GCC 5中也是如此)。

下面的非标准代码

int x = std::rand();
int r[x] = { 1,2,3 };

在g++下编译,不是因为
g++
错误地对待
std::rand()
作为一个常量表达式,但由于默认情况下它实现了vla。使用
-pedantic
-Wvla
对它们进行警告,使用
-Werror=vla
将这些警告转化为错误。

如果您尝试用clang++编译此代码,它会指出“不允许使用可变大小数组”-所以我觉得gcc不够迂腐。说服gcc强制遵守可能是一件痛苦的事。我发现使用标志
--迂腐错误
编译似乎可以解决问题。我倾向于将严格一致性作为默认值,并使用标志关闭一致性。该站点在编译器上启用严格一致性模式吗(我太懒了,不知道要让哪些脚本/第三方站点能够自己查看)?如果不是,原因是g++对大小非恒定的自动存储持续时间数组有一个非标准扩展。@Matstpeterson
clang
似乎有一个错误,因为它仍然不接受§5.19/3。例如,它不编译其中的代码,尽管这似乎是一个有效的代码。无论如何,请确保使用严格的la语言符合性标志。没有带有
-pedantic errors
的错误消息,也没有带有
-pedantic
的警告。您认为这也是一个可变长度数组吗?
结构a{operator int(){return 5;}}a;int main(){int b[a]{0,1,2,3,4};}
@Ayrosa-hmm,我试过了,当使用g++-4.9.2使用
-std=c++14
编译时,显然没有警告/错误,但当使用
-std=c++11
编译时,却有警告。警告在使用g++-5.2.0的c++14中起作用。这可能是一个编译器错误,显然已经修复。GCC不知道其标准一致性,尽管它是渐进的在这方面有所改进。@Ayrosa我搜索了一下为什么即使使用
-pedantic
也可以使用VLA。请参阅我的编辑。但是,当我在上面的代码中使用
-pedantic
时,错误不会显示。@Ayrosa可能是因为4.9相对较旧。它会在5.2中显示。如果我将函数
f
更改为
constepr
>在我上面的代码中,
5.2
仍然显示错误,但现在我相信该代码是合法的,因为§5.19/2和§5.19/3。这是一个完全不同的问题。对不起。代码在5.2中没有显示错误,但警告仍然存在。你能解释一下原因吗?我对gcc编译器不是很熟悉。
int x = std::rand();
int r[x] = { 1,2,3 };