【发布时间】:2014-07-01 15:20:36
【问题描述】:
clang (3.4) 似乎会自动接受一些 c++11(例如 auto,for(:))而没有特殊标志(尽管会产生警告),但不接受其他部分(例如 lambdas).
例如以下编译clang++ c++11.success.cpp:
#include <vector>
int main( int argCount, char ** argVec )
{
std::vector<int> vec;
for( auto & item : vec )
{
++item;
}
return 0;
}
但这失败了clang++ c++11.failure.cpp:
#include <vector>
int main( int argCount, char ** argVec )
{
std::vector<int> vec;
auto lambda = [] ( int & foo ) { return ++foo; }; //This line fails at []
for( auto & item : vec )
{
lambda( item );
}
return 0;
}
clang++ c++11.failure.cpp -std=c++11 当然成功了。
我找不到任何关于在没有-std=c++11 的情况下支持哪些c++11 功能以及原因的具体文档。有人知道吗?
【问题讨论】:
-
“为什么?”大概是因为某些更改是侵入性的,不能轻易禁用。
-
也许也因为它们不会破坏 C++03 代码,因此可以被视为扩展。
-
这个问题似乎是题外话,因为它是关于 clang 的创建者做出的设计决策,这很可能只能由他们来回答,并且很可能是基于意见的。
-
在没有 -std=c++11 的情况下,clang 3.4 是否仍符合 C++03?基于范围的for循环可以认为是一种扩展,“auto”关键字的用法呢?
-
@PlasmaHH,我不同意这是题外话。虽然这可能只是一个设计决策,但也很有可能存在基于概念和标准的答案。对于这个问题,没有其他更好的 stackexchange 站点了,它与 C++ 程序员决定哪些功能“安全”使用非常相关。