直接初始化条件

时间:2015-07-02 13:01:35

标签: c++ if-statement initialization c++03

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

if(int i = 17) { ... }

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

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

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

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

GCC会发出error: expected primary-expression before 'f'

Live on Coliru

除了&#34之外还有其他原因吗?因为语法是这样说的" ?我该如何解决它?

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

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

...所以我宁愿避免复制或重复其类型。

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

3 个答案:

答案 0 :(得分:10)

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

  

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

     

条件
表达
type-specifier-seq 声明者 =   赋值表达式

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

  

条件
  表达
   attribute-specifier-seq opt decl-specifier-seq 声明符 = 初始化子句
   attribute-specifier-seq opt decl-specifier-seq 声明符   支撑-INIT-列表

直接初始化的语法,即Foo f(…),大概是因为非静态数据成员初始化程序不允许的原因而被避免:歧义,特别是“最令人烦恼的解析”。

答案 1 :(得分:2)

因为C ++ 03标准只允许在条件内进行赋值初始化:

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

答案 2 :(得分:2)

鉴于你的限制,我相信C ++ 03你唯一的选择就是在if语句之外声明变量,为范围界定添加大括号:

{
    Foo f(51, 52);
    if (f) {
        //...
    }
}

在C ++ 11中,您可以利用支持的初始化语法:

if (Foo f{51, 52}) {
    //...
}