C++ C++;11 Eclipse错误格式化的统一初始化
我试图在EclipseCDTLuna4.4中使用C++11统一初始化,这样我就可以更容易地发现狭窄发生的地方。我有两个问题。首先,代码样式格式化程序有时将大括号初始化视为一块代码(示例2)。第二种情况是,没有赋值运算符的统一初始化会给我一个编译器错误和一个警告(示例4) 我的项目设置为使用“isoc++11(-std=C++0x)”语言标准方言。使用gcc版本4.8.1(gcc) 以下是一些格式示例,每个示例包含代码前后的格式: 示例#1初始化-格式良好,无编译器消息: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};
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
- 非限定列表,
必须根据使用上下文确定类型{…}
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是无效语法