为什么gcc4.9在使用C ++ 14功能时不显示警告消息-std = c ++ 1y?

时间:2014-05-03 02:48:49

标签: gcc c++11 c++14 gcc4.9

我使用SO帖here中提到的步骤安装了gcc4.9。我使用的是C ++ 14中引入的最新功能 std::exchange() 实用程序功能。

#include<list>
#include<utility>
int main() {
    std::list<int> lin{5,6,7,8,9};
    auto lout = std::exchange(lin, {1,2,3,4});
   return 0;
}

我执行了以下步骤来编译上面的示例程序,并得到以下编译错误。一段时间后,我意识到(由于没有编译器消息的警告/提示)这个功能已经添加到C ++ 14标准中,所以我需要在这里使用 -std=c++1y

$g++ -std=c++11 main.cpp

main.cpp: In function ‘int main()’:
main.cpp:5:14: error: ‘exchange’ is not a member of ‘std’
  auto lout = std::exchange(lin, {1,2,3,4});
              ^

如果我们使用C ++ 11标准功能但未提供 -std=c++11 ,那么GCC会发出警告消息/提示您的程序正在使用C ++ 11中引入的功能如下:

main.cpp:4:21: warning: extended initializer lists only available with
-std=c++11 or -std=gnu++11
  std::list<int> lin{5,6,7,8,9};

此消息很棒,让用户可以区分实际的编译错误消息,而不包括-std=c++11选项。

然而,在-std=c++11下使用gcc4.9 for C ++ 1y功能时,没有这样的警告消息/提示?我想知道可能的原因是什么?。

1 个答案:

答案 0 :(得分:6)

关于&#34;扩展初始化列表的错误/警告&#34;由C ++解析器发出。 C ++ 解析器显然知道如何解析该语法结构,理解它并且可以 提供合理的错误/警告信息。

有了这个功能,情况就有点不同了。海湾合作委员会本身没有 包含有关每个标准功能的知识。对于某些功能,它确实如此 对于大多数功能,它没有。

从编译器的正确角度来看,std::exchange只是一个未知的标识符,编译器不包含有关标准函数std::exchange的特殊知识,因此将其视为任何其他未知标识符

相关问题