首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编译器在使用列表初始化时不会出现错误,这会导致信息丢失。

编译器在使用列表初始化时不会出现错误,这会导致信息丢失。
EN

Stack Overflow用户
提问于 2013-07-10 00:11:47
回答 2查看 98关注 0票数 1

在c++引物(5)中,它提到:

当与内置类型的变量一起使用时,这种形式的初始化具有一个重要属性:如果初始化程序可能导致信息丢失,编译器将不允许我们列出内置类型的初始化变量:

代码语言:javascript
复制
longdouble ld = 3.1415926536;
int a{ld}, b = {ld}; // error: narrowing conversion required
int c(ld), d = ld;  // ok: but value will be truncate

我使用gcc4.8.1编译代码,它只给出警告而不是错误。

代码语言:javascript
复制
g++  -W -Wall -Wextra -pedantic -std=c++0x  -o m main.cpp


main.cpp: In function ‘int main()’:
main.cpp:64:13: warning: narrowing conversion of ‘ld’ from ‘long double’ to ‘int’ inside { } [-Wnarrowing]
     int a{ld}, b= {ld}; 
             ^
main.cpp:64:22: warning: narrowing conversion of ‘ld’ from ‘long double’ to ‘int’ inside { } [-Wnarrowing]
     int a{ld}, b= {ld}; 

是否有任何标志将打开重要属性的特性?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-10 00:35:15

快速搜索"gcc诊断标志“可以找到文档资源。

在您的程序中,您可以这样做:

代码语言:javascript
复制
#ifdef __GNUC__
#   pragma GCC diagnostic error "-Wnarrowing"
#endif

还有一个命令行选项:-Werror=narrowing,但根据GCC的说法,由于您想要更改程序本身的语义,将其放在源代码中可能更合适。

请注意,除了简单的良好构造性(如过载选择)之外,GCC确实正确地诊断了病情。

票数 2
EN

Stack Overflow用户

发布于 2013-07-10 00:59:53

该标准从不调用错误或警告:该标准只需要一个实现来发出诊断。这类诊断是否以编译器错误、警告或与两者完全不同的形式出现,都超出了标准的范围。

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

https://stackoverflow.com/questions/17560389

复制
相关文章

相似问题

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