我试图在EclipseCDT露娜4.4中使用C++11统一初始化,这样我就可以更容易地发现缩小范围的地方。我有两个问题。首先,代码样式格式化程序将大括号初始化处理为有时是一个代码块(示例2)。第二种情况是,没有赋值运算符的统一初始化给了我一个编译器错误和一个警告(示例4)。
我的项目设置为使用"ISO C++11 (-std=c++0x)“语言标准方言。gcc版4.8.1 (GCC)。
下面是一些格式化示例,每个示例都包含代码前后的内容:
示例#1 -初始化-格式良好,没有编译器消息:
int x = {9};
int x = {9};示例2-赋值-格式化程序在'Braces‘选项卡控件'if’语句样式上的‘块’选项,当‘块’设置为‘下一行’时,它也会影响到下面的赋值行为。我希望继续使用我的“if”语句的“下一行”支撑样式(Allman),而不是将其设置为“同一行”(K&R),这也将停止在这里观察到的新行行为:
int x2;
x2 = {9};
int x2;
x2 =
{ 9};示例3-无需赋值操作符的初始化格式很好,没有编译器消息:
int y{9};
int y{9};示例4-赋值没有赋值操作符-格式很好,但是给出了expected ';' before '{' token错误和statement has no effect [-Wunused-value]编译器警告:
int y2;
y2{9};
int y2;
y2{9};似乎没有中间路线。在示例1和#3中,使用统一初始化来初始化都很好,但是当涉及到#2和#4中的赋值时,前者存在格式化错误,后者生成编译器消息。
我是一个C++新手,有人对我的逻辑有任何建议或看到大象在房间里吗?我得到的印象是,统一初始化不应该用于赋值,因为我没有看到这方面的任何例子,但令我困惑的是,即使在#2中赋值会产生格式错误,编译器在提供浮点数时确实会给出正确的narrowing conversion ... [-Wnarrowing]编译器警告。
任何帮助都是感激的,谢谢!
发布于 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)示例:
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是无效的语法。
发布于 2014-07-22 21:42:25
我确信您的示例2是Eclipse中的一个bug;它是一个有用的工具,但它不是一个成熟的C++编译器,有时它会出错。如果Eclipse不理解C++编译器所做的事情,那么它就是月食Bugzilla中的一个bug,应该在月食Bugzilla上报告。
然而,在我看来,使用统一的初始化器来分配任务似乎很奇怪。我确信其中的一些原因是我对C++11相对缺乏经验,但是为什么不坚持一种更传统的编码风格,使用其他编译器标志(比如-Wconversion)来捕捉不必要的精度损失呢?
https://stackoverflow.com/questions/24898024
复制相似问题