声明变量,其类型具有已删除的默认构造函数,没有值

Declare variable, whose type has an deleted default constructor, without a value

我想在多个if-else分支中初始化一个变量,以备后用,基本上是这样的:

Foo foo;

if (someCondition) {
    std::string someString = getTheString();
    // do some stuff
    foo = Foo(someString);
} else {
    int someInt = getTheInt();
    //do some other stuff maybe
    foo = Foo(someInt);
}

// use foo here

不幸的是,在此示例中,类型 Foo 具有已删除的默认构造函数,因此上面的代码无法编译。有没有办法以这种方式初始化这样的变量?

编辑:

正如您在我的示例中所看到的,我使用了不同的构造函数并且还在 if/else 块中做了其他事情,所以不幸的是三元运算符不起作用。
如果没有办法,没有 foo 作为指针,我显然可以采取不同的方法,但我很好奇,如果我的方法以某种方式起作用。

您还没有告诉我们为什么您不能使用指针...但是,与此同时,这是一个表面上没有指针的解决方案:

#include <optional>    
std::optional<Foo> foo;

if (someCondition) {
    std::string someString = getTheString();
    // do some stuff
    foo.emplace(someString);
} else {
    int someInt = getTheInt();
    //do some other stuff maybe
    foo.emplace(someInt);
}
if (foo.has_value()) { /* use foo here */ }

如果您有编码标准或禁止使用 raw 指针(和 new)的东西,那么您可以使用 std::unique_ptr

#include <memory>
std::unique_ptr<Foo> foo;

if (someCondition) {
    std::string someString = getTheString();
    // do some stuff
    foo = std::make_unique<Foo>(someString);
} else {
    int someInt = getTheInt();
    //do some other stuff maybe
    foo = std::make_unique<Foo>(someInt);
}
if (foo) {/* use foo here */}

您还可以将 Foo 创建逻辑放在单独的函数(或 lambda)中:

auto getFoo(/* ... */) {
    if (someCondition) {
        std::string someString = getTheString();
        // do some stuff
        return Foo(someString);
    } else {
        int someInt = getTheInt();
        //do some other stuff maybe
        return Foo(someInt);
   }
}
// ...
Foo foo = getFoo(/*...*/);
// use foo here