直接初始化条件内的对象
Direct-initializing an object inside a condition
可以在if
语句的条件内定义和复制初始化变量:
if(int i = 17) { ... }
这也适用于用户定义的类型,因为它们重载了operator bool
:
if(Foo f = 42) { ... }
if(Foo f = Foo(43)) { ... }
为什么我不能使用直接初始化,如下所示?
if(Foo f(51)) { ... }
GCC发射CCD_ 3。
在Coliru 上直播
除了"因为语法这么说"之外,还有其他原因吗?我该如何解决它?
我使用的是VC++03,其中Foo
:
- 是一个RAII敏感对象,为此我注意而不是定义复制构造函数
- 是接受用户参数的模板
- 有一个双参数构造函数
所以我宁愿避免复制或重复它的类型。
注意:虽然我的实际问题是C++03,但我(在学术上)对C++11中的答案感兴趣。
在C++03中,可以单独使用复制初始化语法:
选择语句:
nbsp nbsp;if (
条件)
语句
nbsp nbsp […]条件:
nbsp nbsp表达式
nbsp nbsp 类型说明符seq声明符=
赋值表达式
从C++11开始,增加了列表初始化:
条件:
nbsp nbsp表达式
nbsp nbsp属性说明符seqoptdecl说明符seq声明符=
初始值设定项子句
nbsp nbsp属性说明符seqoptdecl说明符seq声明符支持的初始列表
直接初始化的语法,即Foo f(…)
,可能被避免了,原因与非静态数据成员初始化程序不允许使用的原因相同:歧义,特别是"最麻烦的解析"。
因为C++03标准只允许在条件内初始化赋值:
condition:
expression
type-specifier-seq declarator = assignment-expression
考虑到您的限制,我相信在C++03中,您唯一的选择是在if
语句之外声明变量,并添加大括号用于作用域:
{
Foo f(51, 52);
if (f) {
//...
}
}
在C++11中,您可以利用支持的初始化语法:
if (Foo f{51, 52}) {
//...
}
相关文章:
- 在什么条件下使用 std::memcpy 在对象之间复制是安全的?
- 在运行时有条件地删除类成员或跳过调用该成员对象的构造函数
- C++,如何根据运行时条件构造引用不同 istream 对象的对象?
- 如何使用条件表达式返回对象指针?
- 当线程处理不同的类时,应该在哪里声明条件变量、互斥对象
- 在条件运算符中使用对象两次会产生 UB 吗?
- 什么保证两个不相关的线程中的不同不相关对象没有(不可避免的)争用条件?
- 使用两个条件对对象的向量进行排序
- 隐式使用类对象作为条件 c++
- 在c++中有条件地创建一个对象
- 使用两个条件迭代自定义对象的向量
- 有条件地从函数返回对象类型
- 你真的能用WaitFor..等待条件变量吗..对象
- 有条件地构造没有默认构造函数的成员对象
- 确定是否将对象分配在静态内存块中(还是如何避免数据竞赛条件)
- 如果插槽对象包含互斥锁和条件变量,则 Boost signals2 connect() 调用编译失败
- (C++)如何基于条件声明对象类成员
- 竞争条件:一个线程创建静态对象,另一个线程在初始化完成之前使用它.如何处理
- 使用 iStream 对象测试条件
- 在 C++ 中的 if 条件中创建的对象的范围