c++11 统一初始化不适用于“g++ -std=c++0x”
Posted
技术标签:
【中文标题】c++11 统一初始化不适用于“g++ -std=c++0x”【英文标题】:c++11 uniform initialization doesn't work with "g++ -std=c++0x" 【发布时间】:2016-04-28 16:43:11 【问题描述】:我有一个声明这个公共方法的类:
virtual std::vector<float> operator()(const std::vector<float>& = );
它使用统一初始化(这里只是 ),这是 c++11 的一个特性。使用
clang++ -std=c++11
编译时,这不会给我带来任何问题。但是当我使用g++ -std=c++0x
时,我得到了这个:
error: expected primary-expression before '' token
-std=c++0x
选项不应该给我带来 c++11 支持吗?
当像这样使用标准 c++ 声明方法时,编译器没有给我任何错误:
virtual std::vector<float> operator()(const std::vector<float>& = std::vector<float>());
我在 Ubuntu 12.04 上使用 g++ 4.6
【问题讨论】:
不确定你在问什么std=c++0x
不是 c++11 支持,它是 11 之前的,正如 gcc 开发人员在 4.6 那天所理解的那样。如果你想要完整的 c++11,请使用-std=c++11
。
看起来像一个 gcc 错误。它在 4.7.3 及更高版本中编译:godbolt.org/g/gy9Kb5
现在有了c++11/c++14,用c++0x/c++1y也没意义了。一旦 c++17 出来,c++1z 也将不再需要。
@George 实验支持!= 工作支持。
当时他们还在添加功能。 C++11 对 C++ 来说是巨大的变化。您不能期望实验性支持具有所有 C++11 功能并且所有功能都按预期工作。正则表达式是 C++11 的一部分,但直到 gcc 4.9 才支持它们,直到 gcc 5 才真正稳定。如果您坚持使用 gcc 4.6,那么您只需要学习接受它为 C+ 提供的有限支持+11。
【参考方案1】:
来自GCC 4.7 release notes:
G++ 现在接受
-std=c++11
、-std=gnu++11
和-Wc++11-compat
选项,它们分别相当于-std=c++0x
、-std=gnu++0x
和-Wc++0x-compat
。
来自C++11 in GCC project page:
GCC 4.8.1 是 2011 年 C++ 标准(以前称为 C++0x)的第一个功能完整的实现。
坏消息,您需要升级编译器才能获得 C++11 支持。
【讨论】:
【参考方案2】:GCC 4.6 不支持所有 c++11 功能:
GCC 为即将推出的 ISO C++ 标准 C++0x 提供实验性支持。可以使用 -std=c++0x 启用此支持。
我建议你升级到最新的 GCC 版本,并使用标志 -std=c++11
甚至 -std=c++14
进行编译
【讨论】:
以上是关于c++11 统一初始化不适用于“g++ -std=c++0x”的主要内容,如果未能解决你的问题,请参考以下文章