假设我有一个具有不同构造函数的类:
class A
{
public:
A(char* string)
{
//...
}
A(int value)
{
//..
}
void check() {}
};
Run Code Online (Sandbox Code Playgroud)
现在我想在堆栈上创建一个A对象,必须根据某些条件选择构造函数,但是存在一个问题:创建的对象被销毁然后我们退出{...}块.
bool isTrue() { /*...*/ }
int main()
{
if (isTrue())
{
A a("string");
}
else
{
A a(10);
}
a.check(); //error: 'a' is not defined in this scope
}
Run Code Online (Sandbox Code Playgroud)
假设我有没有拷贝构造函数或operator=在A类.那怎么能解决这个问题呢?
http://ideone.com/YsjmnK
A a = isTrue() ? A("string") : A(10);
如果a.check()是const成员函数,替代方案可能更好:
const A& a = isTrue() ? A("string") : A(10);
当引用a超出范围时,该对象将被销毁.
因为C++ 17注意,根据规则复制省略成为该情况下可访问的复制/移动的构造不是必需的; 这里保证复制省略.
从C++ 17开始,你可以使用std :: optional,它不会导致任何动态内存分配.例如
std::optional<A> a;
if (isTrue())
{
a.emplace("string");
}
else
{
a.emplace(10);
}
(*a).check();
Run Code Online (Sandbox Code Playgroud)
顺便说一句:A(char* string)应该是A(const char* string).