可以在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'
。
除了&#34之外还有其他原因吗?因为语法是这样说的" ?我该如何解决它?
我正在使用VC ++ 03,其中Foo
:
...所以我宁愿避免复制或重复其类型。
注意:虽然我的实际问题是C ++ 03,但我(学术上)对C ++ 11中的答案很感兴趣。
答案 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}) {
//...
}