我正在尝试在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 - 分配 - “大括号”标签上“格式化程序”的“块”选项控制“if”语句样式,它还会影响以下分配行为当'Blocks'设置为'Next line'时。我希望继续使用'下一行'支撑样式(Allman)作为我的'if'语句,而不是将其设置为'Same line'(K& R),这也会阻止此处观察到的新行行为:
int x2;
x2 = {9};
int x2;
x2 =
{ 9};
示例#3 - 初始化没有赋值运算符 - 格式正常,没有编译器消息:
int y{9};
int y{9};
示例#4 - 分配没有赋值运算符 - 格式正常,但是会出现expected ';' before '{' token
错误并且{{1编译器警告:
statement has no effect [-Wunused-value]
似乎没有中间立场。使用统一初始化初始化在示例#1和#3中都可以正常工作,但是当在#2和#4中进行赋值时,前者具有格式错误,后者产生编译器消息。
我是C ++新手,任何人都有任何建议或在我的逻辑中看到房间里的大象?我得到的印象是,统一初始化不应该用于赋值,因为我没有看到任何这样的例子,但令我困惑的是,即使在#2中赋值给出了格式错误,编译器确实给出了正确的{{1}输入浮点数时编译器警告。
感谢任何帮助,谢谢!
答案 0 :(得分: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
因此,示例#1和#3被命名为变量初始化,示例#2是赋值运算符的右侧操作数(可以将其报告为Eclipse的错误),示例#4是无效的语法。
答案 1 :(得分:1)
我确信您的示例#2是Eclipse CDT中的错误;它是一个有用的工具,但它不是一个完整的C ++编译器,它有时会出错。如果Eclipse CDT不理解C ++编译器所做的事情,那么它就是Eclipse中的一个错误,应该在Eclipse Bugzilla上报告。
但是,使用统一的初始化程序进行分配对我来说很奇怪。我确信其中一些是我对C ++ 11的相对缺乏经验,但为什么不坚持使用更传统的编码风格并使用其他编译器标志(如-Wconversion
)来捕获不必要的精度损失? / p>