5

我正在尝试在 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};

示例 #2 -赋值- 'Braces' 选项卡上的 'Blocks' 格式化程序选项控制 'if' 语句样式,当 'Blocks' 设置为 'Next line' 时,它也会影响下面的赋值行为。我希望继续为我的“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]器在输入时确实会给出正确的编译器警告一个浮点数。

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

4

2 回答 2

3

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

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

  • 限定列表,T{...}创建类型的对象T
  • Unqualified Lists,{...}即必须根据使用上下文确定类型。

限定列表:如果您可以初始化变量 x as那么您可以使用orT x {v}将对象创建为表达式。T{v}new T{v}

Unqualified Lists:它可以用于明确知道预期类型的​​地方。

  • 赋值运算符的右侧操作数,如=,+=-=(示例 #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 是无效的语法。

于 2014-07-23T00:25:16.587 回答
1

我确定您的示例 #2 是 Eclipse CDT 中的错误;它是一个有用的工具,但它不是一个成熟的 C++ 编译器,它有时会出错。如果 Eclipse CDT 不能理解 C++ 编译器所做的事情,那么这是 Eclipse 中的一个错误,应该在Eclipse Bugzilla上报告。

但是,对我来说,使用统一初始化程序进行赋值看起来很奇怪。我敢肯定,其中一些原因是我相对缺乏 C++11 经验,但为什么不坚持使用更传统的编码风格并使用其他编译器标志(如-Wconversion)来捕获不必要的精度损失?

于 2014-07-22T21:42:25.790 回答