C++ C++;11 Eclipse错误格式化的统一初始化

C++ C++;11 Eclipse错误格式化的统一初始化,c++,eclipse,c++11,eclipse-cdt,uniform-initialization,C++,Eclipse,C++11,Eclipse Cdt,Uniform Initialization,我试图在EclipseCDTLuna4.4中使用C++11统一初始化,这样我就可以更容易地发现狭窄发生的地方。我有两个问题。首先,代码样式格式化程序有时将大括号初始化视为一块代码(示例2)。第二种情况是,没有赋值运算符的统一初始化会给我一个编译器错误和一个警告(示例4) 我的项目设置为使用“isoc++11(-std=C++0x)”语言标准方言。使用gcc版本4.8.1(gcc) 以下是一些格式示例,每个示例包含代码前后的格式: 示例#1初始化-格式良好,无编译器消息: int x = {9};

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

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

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

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

int x = {9};

int x = {9};
int y{9};

int y{9};
示例#2赋值-格式化程序在“大括号”选项卡上的“块”选项控制“如果”语句样式,当“块”设置为“下一行”时,它还影响下面的赋值行为。我希望在我的“if”语句中继续使用“Next line”大括号样式(Allman),而不是将其设置为“Same line”(K&R),这也将停止此处观察到的新行行为:

int x2;
x2 = {9};

int x2;
x2 =
{       9};
示例#3-不带赋值运算符的初始化-格式良好,无编译器消息:

int x = {9};

int x = {9};
int y{9};

int y{9};
示例#4-赋值不带赋值运算符-格式很好,但会给出一个
预期的“;”在“{”标记之前
错误且
语句无效[-Wunused value]
编译器警告:

int y2;
y2{9};

int y2;
y2{9};
似乎没有中间立场。使用统一初始化在示例1和示例3中都很好,但在示例2和示例4中的赋值时,前者有格式错误,后者生成编译器消息

<>我是C++新手,在我的逻辑中有人有任何建议或看到象在房间里吗?我感觉到,不应该使用统一的初始化来分配,因为我没有看到任何例子,但是让我困惑的是,即使在2中赋值给格式错误,编译器也给出正确的结果。
缩小转换…[-Wnarrowing]
输入浮点数时出现编译器警告


<> P> >任何帮助都是值得感谢的,谢谢!

< P>我确信你的例子2是Eclipse CDT中的一个bug;它是一个有用的工具,但它不是一个完整的C++编译器,它有时会出错。如果Eclipse CDT不理解C++编译器所做的事情,那么它是Eclipse中的一个bug,应该在.< /P>上报告。
然而,在我看来,使用统一的初始值设定项进行赋值看起来很奇怪。我确信其中一些原因是我对C++11相对缺乏经验,但为什么不坚持使用更传统的编码风格,并使用其他编译器标志(如)为了避免不必要的精度损失,

< P>我将尝试从<代码> C++编程语言,第四版< /C>中解释,在代码< > 11.3 < /COD> < < /P>中可以找到更详细的解释。
{}-lists
可用于初始化命名变量(例如#1和#3)。此外,
{}-lists
可作为表达式使用,它们可以以两种形式出现

  • 限定列表,
    T{…}
    创建类型为
    T
  • 非限定列表,
    {…}
    必须根据使用上下文确定类型
限定列表: 如果可以将变量x初始化为
tx{v}
,则可以使用
tv}
newt{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报告为bug),示例#4是无效语法