Eclipse的C++ 11统一初始化格式不正确

use*_*423 5 c++ eclipse eclipse-cdt uniform-initialization c++11

我正在尝试在Eclipse CDT Luna 4.4中使用C++ 11统一初始化,以便我可以更容易地发现缩小范围.我有两个问题.第一个是代码样式格式化程序正在将大括号初始化视为有时是一个代码块(例如#2).第二个是,没有赋值运算符的统一初始化给了我编译器错误和警告(例子#4).

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

以下是一些格式示例,每个示例包含代码前后:

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

int x = {9};

int x = {9};
Run Code Online (Sandbox Code Playgroud)

示例#2 - 赋值 - 格式化程序的"大括号"选项卡上"块"的选项控制"if"语句样式,当"块"设置为"下一行"时,它还会影响以下分配行为.我希望继续使用'下一行'支撑样式(Allman)作为我的'if'语句,而不是将其设置为'Same line'(K&R),这也会停止在此处观察到的新行行为:

int x2;
x2 = {9};

int x2;
x2 =
{       9};
Run Code Online (Sandbox Code Playgroud)

示例#3 - 没有赋值运算符的初始化 - 格式正常,没有编译器消息:

int y{9};

int y{9};
Run Code Online (Sandbox Code Playgroud)

例4 - 分配赋值运算符 -格式正常,但是给出了一个expected ';' before '{' token错误,一个statement has no effect [-Wunused-value]编译器警告:

int y2;
y2{9};

int y2;
y2{9};
Run Code Online (Sandbox Code Playgroud)

似乎没有中间立场.使用统一初始化初始化在示例#1和#3中都可以正常工作,但是当在#2和#4中进行赋值时,前者具有格式错误,后者产生编译器消息.

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

任何帮助表示赞赏,谢谢!

Alp*_*per 3

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

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

  • 限定列表,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
Run Code Online (Sandbox Code Playgroud)

因此,示例 #1 和 #3 被命名为变量初始化,示例 #2 是赋值运算符的右侧操作数(它可能会被报告为 Eclipse 的错误),示例 #4 不是有效语法。