Man*_*mar 0 gcc c++11 gcc4.9 c++14
我使用的SO帖子中提到的步骤安装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;
}
Run Code Online (Sandbox Code Playgroud)
我执行了以下步骤来编译上面的示例程序,并得到以下编译错误.一段时间后,我意识到(由于没有编译器消息的警告/提示)这个功能已经添加到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});
^
Run Code Online (Sandbox Code Playgroud)
如果我们使用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};
Run Code Online (Sandbox Code Playgroud)
此消息很棒,让用户可以区分实际的编译错误消息而不包括-std=c++11选项.
但是在使用gcc4.9 for C++ 1y功能时-std=c++11,没有这样的警告消息/提示?我想知道可能的原因是什么?
C++解析器发出有关"扩展初始化列表"的错误/警告.C++解析器显然知道如何解析该语法结构,理解它并且可以提供合理的错误/警告消息.
有了这个功能,情况就有点不同了.GCC本身并不包含有关每个标准功能的知识.对于某些功能,它可以,但对于大多数功能,它没有.
从编译器正确的角度来看,std::exchange只是一个未知的标识符,编译器不包含有关标准函数的特殊知识std::exchange,因此将其视为任何其他未知标识符.