首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么gcc4.9在使用-std=c++1y特性时不显示警告消息C++14?

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

Stack Overflow用户
提问于 2014-05-03 02:48:48
回答 1查看 608关注 0票数 0

我使用SO 这里中提到的步骤安装了gcc4.9。我使用的是最新的特性http://en.cppreference.com/w/cpp/utility/exchange实用程序函数,它是在C++14中引入的。

代码语言:javascript
运行
复制
#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。

代码语言:javascript
运行
复制
$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中引入的特性,如下所示:

代码语言:javascript
运行
复制
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特性时,没有这样的警告消息/提示吗?我想知道这可能的原因是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-03 12:53:56

有关“扩展初始化程序列表”的错误/警告由C++解析器发出。C++解析器显然知道如何解析该语法结构,理解它,并能够提供合理的错误/警告消息。

有了功能,情况就有点不同了。GCC本身并不包含关于每一个标准功能的知识。对于某些函数,它是这样做的,但是对于大多数函数,它没有。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23439659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档