C++:如何根据条件选择构造函数?

yak*_*kov 1 c++ scope

假设我有一个具有不同构造函数的类:

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

son*_*yao 5

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).

  • @yakov你错了:-).这是标准需要可访问的复制构造函数但允许编译器忽略它的情况之一.例如,尝试将复制构造函数设为私有.标准对此非常明确:"第二个和第三个操作数具有相同的类型;结果是该类型.如果操作数具有类类型,则结果是结果类型的prvalue临时值,这是**copy-根据第一个操作数的值,从第二个操作数或第三个操作数初始化**. (3认同)