首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11统一初始化被Eclipse错误格式化

C++11统一初始化被Eclipse错误格式化
EN

Stack Overflow用户
提问于 2014-07-22 21:18:41
回答 2查看 476关注 0票数 5

我试图在EclipseCDT露娜4.4中使用C++11统一初始化,这样我就可以更容易地发现缩小范围的地方。我有两个问题。首先,代码样式格式化程序将大括号初始化处理为有时是一个代码块(示例2)。第二种情况是,没有赋值运算符的统一初始化给了我一个编译器错误和一个警告(示例4)。

我的项目设置为使用"ISO C++11 (-std=c++0x)“语言标准方言。gcc版4.8.1 (GCC)。

下面是一些格式化示例,每个示例都包含代码前后的内容:

示例#1 -初始化-格式良好,没有编译器消息:

代码语言:javascript
复制
int x = {9};

int x = {9};

示例2-赋值-格式化程序在'Braces‘选项卡控件'if’语句样式上的‘块’选项,当‘块’设置为‘下一行’时,它也会影响到下面的赋值行为。我希望继续使用我的“if”语句的“下一行”支撑样式(Allman),而不是将其设置为“同一行”(K&R),这也将停止在这里观察到的新行行为:

代码语言:javascript
复制
int x2;
x2 = {9};

int x2;
x2 =
{       9};

示例3-无需赋值操作符的初始化格式很好,没有编译器消息:

代码语言:javascript
复制
int y{9};

int y{9};

示例4-赋值没有赋值操作符-格式很好,但是给出了expected ';' before '{' token错误和statement has no effect [-Wunused-value]编译器警告:

代码语言:javascript
复制
int y2;
y2{9};

int y2;
y2{9};

似乎没有中间路线。在示例1和#3中,使用统一初始化来初始化都很好,但是当涉及到#2和#4中的赋值时,前者存在格式化错误,后者生成编译器消息。

我是一个C++新手,有人对我的逻辑有任何建议或看到大象在房间里吗?我得到的印象是,统一初始化不应该用于赋值,因为我没有看到这方面的任何例子,但令我困惑的是,即使在#2中赋值会产生格式错误,编译器在提供浮点数时确实会给出正确的narrowing conversion ... [-Wnarrowing]编译器警告。

任何帮助都是感激的,谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-23 00:25:16

我将尝试从The C++ Programming Language, 4th Edition中解释,更详细的解释可以在11.3部分找到。

{}-lists可用于初始化命名变量(例如#1和#3)。此外,{}-lists可以用作表达式,它们可以以两种形式出现。

  • 限定列表,创建类型为T{...}的对象的T
  • 非限定列表,{...}表示类型必须从使用的上下文中确定。

限定列表:如果可以将变量x初始化为T x {v},那么可以使用T{v}new T{v}作为表达式创建对象。

非限定列表:它可以用于明确知道预期类型的地方。

  • 赋值操作符(如=+=-=等)的右操作数(示例2)
  • 函数参数
  • 返回值
  • 下标

示例:

代码语言:javascript
复制
int x1{9};         // direct initialisation

int x2 = {9};      // copy initialisation

int x3; 
x3 = {9};          // right-hand operand of assignment operator
x3 += {1};         // right-hand operand of assignment operator
x3 = 9 + {1}       // error, only right-hand operand of assignment operator

因此,示例1和#3被命名为变量初始化,示例2是赋值操作符的右操作数(它可以作为bug报告给Eclipse),示例4是无效的语法。

票数 3
EN

Stack Overflow用户

发布于 2014-07-22 21:42:25

我确信您的示例2是Eclipse中的一个bug;它是一个有用的工具,但它不是一个成熟的C++编译器,有时它会出错。如果Eclipse不理解C++编译器所做的事情,那么它就是月食Bugzilla中的一个bug,应该在月食Bugzilla上报告。

然而,在我看来,使用统一的初始化器来分配任务似乎很奇怪。我确信其中的一些原因是我对C++11相对缺乏经验,但是为什么不坚持一种更传统的编码风格,使用其他编译器标志(比如-Wconversion)来捕捉不必要的精度损失呢?

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

https://stackoverflow.com/questions/24898024

复制
相关文章

相似问题

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