直接初始化条件内的对象

Que*_*tin 11 c++ if-statement initialization c++03

可以在if语句的条件内定义和复制初始化变量:

if(int i = 17) { ... }
Run Code Online (Sandbox Code Playgroud)

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

if(Foo f = 42)      { ... }
if(Foo f = Foo(43)) { ... }
Run Code Online (Sandbox Code Playgroud)

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

if(Foo f(51)) { ... }
Run Code Online (Sandbox Code Playgroud)

GCC发布error: expected primary-expression before 'f'.

住在Coliru

除了"因为语法这么说"之外还有其他原因吗?我该如何解决它?

我正在使用VC++ 03,其中Foo:

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

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

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

Col*_*mbo 11

在C++ 03中,可以单独使用复制初始化语法:

选择陈述:
       if ( 条件 ) 陈述
        [...]

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

从C++ 11开始,添加了列表初始化:

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

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