【发布时间】:2015-07-02 13:01:35
【问题描述】:
可以在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'。
除了“因为语法这么说”之外还有其他原因吗?我该如何解决它?
我正在使用 VC++03,其中Foo:
- 是一个对 RAII 敏感的对象,我注意没有为此定义一个复制构造函数
- 是一个接受用户参数的模板
- 有一个双参数构造函数
...所以我宁愿避免复制它或重复它的类型。
注意:虽然我的实际问题是 C++03,但我(学术上)对 C++11 中的答案很感兴趣。
【问题讨论】:
-
您为什么认为声明
Foo f = 42意味着复制/移动?不应该复制省略工作吗? -
@Columbo AFAIK 复制省略是一种优化,可能会执行或可能不会执行,但即使它不是对象也需要复制构造函数,我已禁用它以避免
auto_ptr-like 邪恶。最后我通过std::pair解决了这个问题。 -
传递
std::pair是如何解决这个问题的?如果它是从不同类型的复制初始化,您仍然需要一个复制构造函数。 -
@bogdan 确实如此。现在我想知道为什么它会起作用。
标签: c++ if-statement initialization c++03