我使用SO 这里中提到的步骤安装了gcc4.9。我使用的是最新的特性http://en.cppreference.com/w/cpp/utility/exchange实用程序函数,它是在C++14中引入的。
#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标准中,所以我需要在这里使用C++14。
$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});
^
如果我们使用-std=c++11
,标准特性而不提供C++11,那么GCC警告message/hint您的程序正在使用在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
选项。
然而,当在C++1y下使用gcc4.9进行-std=c++11
特性时,没有这样的警告消息/提示吗?我想知道这可能的原因是什么?
发布于 2014-05-03 12:53:56
有关“扩展初始化程序列表”的错误/警告由C++解析器发出。C++解析器显然知道如何解析该语法结构,理解它,并能够提供合理的错误/警告消息。
有了功能,情况就有点不同了。GCC本身并不包含关于每一个标准功能的知识。对于某些函数,它是这样做的,但是对于大多数函数,它没有。
从编译器的角度来看,std::exchange
只是一个未知的标识符,编译器不包含关于标准函数std::exchange
的特殊知识,因此将它视为任何其他未知标识符。
https://stackoverflow.com/questions/23439659
复制相似问题