C++ 铿锵++;仅编译C++;11当-std=c++;11选项被删除

C++ 铿锵++;仅编译C++;11当-std=c++;11选项被删除,c++,gcc,c++11,boost,clang,C++,Gcc,C++11,Boost,Clang,请看下面的C++11代码段: #include <boost/format.hpp> int main(int argc, char** argv) { auto s = boost::format(""); return 0; } 没有-std=c++11一切都可以正常编译,但clang会打印一条警告: $ clang++ -o main main.cpp main.cpp:5:3: warning: 'auto' type specifier is a C++11 e

请看下面的C++11代码段:

#include <boost/format.hpp>

int main(int argc, char** argv)
{
  auto s = boost::format("");
  return 0;
}
没有
-std=c++11
一切都可以正常编译,但clang会打印一条警告:

$ clang++ -o main main.cpp
main.cpp:5:3: warning: 'auto' type specifier is a C++11 extension [-Wc++11-extensions]
  auto s = boost::format("");
  ^
因此,看起来一个有效的解决方法是去掉C++11标志,因为当前版本的clang似乎处于C++11模式,不管怎样?缺点是你会收到很多警告

除了完全切换到gcc,还有更好的解决方法吗?修补boost::format或gcc libs的源代码对我来说很好


系统信息:

  • 平台:Arch Linux x86_64
  • 增强版:1.55.0-6
  • gcc libs:4.9.0-1
  • clang++:3.4(标签/发行版\最终版)
现在已关闭。应以叮当声3.4-2将其固定在拱中

Evangelos Foutras从上游合并了以下补丁:

听起来像。提醒:您不能只在单个TU上放置
std=c++11
,以解决任何问题,因为这可能会破坏该TU中声明的所有实体(包含在中的标题)的ODR。沿着这条路径。因此,删除c++11意味着删除所有项目中的c++11(除非您的TU不包含任何内容),这在使用libc++而不是libstdc++以及GCC4.8附带的libstdc++时效果非常好。我怀疑这就是这个变化:(搜索max_align_t)@Chnossos你是对的。这正是这个问题的关键所在。感谢您的链接。以下是错误报告:
$ clang++ -o main main.cpp
main.cpp:5:3: warning: 'auto' type specifier is a C++11 extension [-Wc++11-extensions]
  auto s = boost::format("");
  ^