假设我有一个具有不同构造函数的类:
class A
{
public:
A(char* string)
{
//...
}
A(int value)
{
//..
}
void check() {}
};
现在我想在堆栈上创建一个 A 对象,必须根据某些条件选择构造函数,但有一个问题:创建的对象被销毁然后我们退出 {...} 块。
bool isTrue() { /*...*/ }
int main()
{
if (isTrue())
{
A a("string");
}
else
{
A a(10);
}
a.check(); //error: 'a' is not defined in this scope
}
假设我没有复制构造函数或operator=
in the A
班级。那么如何解决这个问题呢?http://ideone.com/YsjmnK
A a = isTrue() ? A("string") : A(10);
And if a.check()
是一个 const 成员函数,替代方案可能更好:
const A& a = isTrue() ? A("string") : A(10);
当引用时该对象将被销毁a
超出范围。
注意从 C++17 开始,根据以下规则复制省略在这种情况下,复制/移动构造函数不需要可访问;这里保证了复制省略。
从 C++17 开始你可以使用标准::可选,这不会导致任何动态内存分配。例如
std::optional<A> a;
if (isTrue())
{
a.emplace("string");
}
else
{
a.emplace(10);
}
(*a).check();
BTW: A(char* string)
is supposed to be A(const char* string)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)