首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在类似的问题上用clang进行不同的诊断?

为什么在类似的问题上用clang进行不同的诊断?
EN

Stack Overflow用户
提问于 2018-05-22 13:56:49
回答 1查看 48关注 0票数 3

这是我的代码:

代码语言:javascript
复制
#include <vector>

int main()
{
    std::vector<int> a = {1, 2.2};
}

正如预期的那样,由于非法的缩窄转换,这不会编译:

代码语言:javascript
复制
$ clang++ -std=c++11 foo.cpp
foo.cpp:5:30: error: type 'double' cannot be narrowed to 'int' in initializer list [-Wc++11-narrowing]
    std::vector<int> a = {1, 2.2};
                             ^~~

为什么这个编译时只带一个警告?

代码语言:javascript
复制
#include <complex>

int main()
{
    std::complex<int> a = {1, 2.2};
}

以下是警告:

代码语言:javascript
复制
$ clang++ -std=c++11 foo.cpp 
foo.cpp:5:31: warning: implicit conversion from 'double' to 'std::__1::complex<int>::value_type' (aka 'int') changes value from 2.2 to 2 [-Wliteral-conversion]
    std::complex<int> a = {1, 2.2};
                          ~   ^~~
1 warning generated.

我理解诊断的概念,并且只需要C++编译器以错误或警告的形式发出诊断。

但我想确定我在这里没有误解任何概念。特别是,我想知道是否有任何C++概念,我需要知道为什么在第一种情况下c++11-narrowing诊断被发布,而在第二种情况下,literal-conversion诊断被发布。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-22 14:02:02

正在发生两种不同的事情,正如您所看到的,这会导致不同的诊断:

  • 在第一种情况下,您使用复制列表初始化,并找到一个std::vector的构造函数,它接受一个std::initializer_lsit
  • 在第二种情况下,您在LiteralType上使用复制列表初始化,这将导致聚合初始化。

它们都应该防止缩小转换,但似乎clang实现诊断的方式不同。

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

https://stackoverflow.com/questions/50469556

复制
相关文章

相似问题

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