我使用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功能时,没有这样的警告消息/提示?我想知道可能的原因是什么?。
答案 0 :(得分:6)
关于&#34;扩展初始化列表的错误/警告&#34;由C ++解析器发出。 C ++ 解析器显然知道如何解析该语法结构,理解它并且可以 提供合理的错误/警告信息。
有了这个功能,情况就有点不同了。海湾合作委员会本身没有 包含有关每个标准功能的知识。对于某些功能,它确实如此 对于大多数功能,它没有。
从编译器的正确角度来看,std::exchange
只是一个未知的标识符,编译器不包含有关标准函数std::exchange
的特殊知识,因此将其视为任何其他未知标识符