c – 直接初始化一个条件下的对象

可以在if语句的条件中定义和复制一个变量:
if(int i = 17) { ... }

这也适用于用户定义的类型,因为它们重载操作符bool:

if(Foo f = 42)      { ... }
if(Foo f = Foo(43)) { ... }

为什么不能使用直接初始化,如下所示?

if(Foo f(51)) { ... }

GCC在’f’之前发出错误:expected primary-expression.

Live on Coliru

除了“因为语法这么说”以外还有其他的原因吗?而我该如何解决呢?

我正在和VC 03一起工作,Foo:

>是一个RAII敏感对象,为此,我注意不要定义一个复制构造函数
>是从用户获取参数的模板
>有一个两参数的构造函数

所以我宁愿避免复制它或重复它的类型.

注意:虽然我的实际问题是C 03,但我在(学术上)对C11中的答案感兴趣.

解决方法

在C 03中,只能使用复制初始化语法:

selection-statement:
if ( condition ) statement
[…]

condition:
expression
type-specifier-seq declarator =
assignment-expression

由于C 11,列表初始化被添加

condition:
expression
attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause
attribute-specifier-seqopt decl-specifier-seq declarator
braced-init-list

直接初始化的语法,即Foo f(…)可能是由于与非静态数据成员初始化器不允许的原因相同的原因而被避免的:歧义,特别是“最令人烦恼的解析”.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...