C++11统一初始化在Eclipse中格式错误

5
我将使用C++11统一初始化在Eclipse CDT Luna 4.4中,以便更容易地发现狭窄的位置。我有两个问题。第一个问题是代码样式格式化程序有时会将括号初始化视为代码块(示例#2)。第二个问题是,不带赋值运算符的统一初始化会给我带来编译器错误和警告(示例#4)。
我的项目设置为使用“ISO C ++ 11(-std = c ++ 0x)”语言标准方言。使用gcc版本4.8.1(GCC)。
下面是一些格式化示例,每个示例都包含代码的前后内容: 示例#1 - 初始化 - 格式良好,没有编译器消息:
int x = {9};

int x = {9};

例子 #2 - 赋值 - 格式化选项中'Braces'选项卡上的'Blocks'控制'if'语句的样式,当'Blocks'设置为'Next line'时,它也会影响下面的赋值行为。我希望继续使用'Next line'括号样式(Allman)来编写我的'if'语句,而不是将其设置为'Same line'(K&R),这也会停止在此处观察到的新行行为:

int x2;
x2 = {9};

int x2;
x2 =
{       9};

示例#3 - 不使用分配运算符进行初始化 - 格式正确,没有编译器消息:

int y{9};

int y{9};

例子 #4 - 没有使用赋值运算符的赋值 - 格式正确,但是会出现编译器错误expected ';' before '{' tokenstatement has no effect [-Wunused-value]警告:

int y2;
y2{9};

int y2;
y2{9};

似乎没有中间地带。在示例1和3中使用统一初始化来初始化工作正常,但对于示例2和4的赋值操作,前者存在格式错误,而后者会产生编译器错误消息。
我是一名C++初学者,有人有任何建议或者看到我的逻辑中隐藏的问题吗?我有一种印象,统一初始化不应该用于赋值操作,因为我没有看到任何这方面的示例,但让我困惑的是,即使在示例2中进行赋值操作会导致格式错误,编译器在输入浮点数时仍会给出正确的“窄化转换... [-Wnarrowing]”编译器警告。
感谢任何帮助,谢谢!
2个回答

3

我将从《C++程序设计语言第4版》尝试解释,更详细的解释可以在第11.3节找到。

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

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

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

非限定列表: 它可以在期望的类型明确无误的情况下使用。

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

例如:

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是赋值运算符的右操作数(可能会被Eclipse报告为错误),而示例#4不是有效的语法。

1
我确定你提到的第二个例子是Eclipse CDT中的一个bug。它是一个有用的工具,但它不是一个完整的C++编译器,有时会出现错误。如果Eclipse CDT不能理解C++编译器理解的内容,则应该在Eclipse Bugzilla上报告这个问题。
然而,使用统一初始化列表进行赋值对我来说看起来很奇怪。我相信其中有些是由于我对C++11的经验相对较少,但为什么不坚持更传统的编码风格,并使用其他编译器标志(如-Wconversion)捕获不想要的精度损失呢?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接