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”的主要内容,如果未能解决你的问题,请参考以下文章

c++11 统一初始化

c++11 统一初始化

-std=c++11 在 g++ 命令行中的位置

为什么成员在此示例中未进行零初始化?

将 -std=c++11 设为 mac 终端的默认值

gcc/g++支持c11