是否有另一种方法可以在不创建另一个对象的情况下实现 std::Optional 的功能?

Jo3*_*erR 1 c++ stdoptional

class ScopedClass {
 public:
  ScopedClass() {
    cout << "constructor called\n";
  }

  ~ScopedClass() {
    cout << "destructor called\n";
  }

  ScopedClass(const ScopedClass &t)
  {
      cout << "copy constructor called\n";
  }

  ScopedClass(ScopedClass &&t)
  {
      cout << "move constructor called\n";
  }
}

std::optional<ScopedClass> check_and_return(bool condition) {
  if (condition == true)
    return std::make_optional(ScopedClass());
  return std::nullopt;
}

int main() {
  auto x = check_and_return(true);
}
Run Code Online (Sandbox Code Playgroud)

我想要一个ScopedClass对象,但当ScopedClass()我将其包含在std::optional. 这意味着析构函数在复制/移动时被调用,并且被调用两次。一旦进入check_and_return,一次main结束时。

我希望仅在结束时调用析构函数main。

有办法实现这一点吗?或者不使用某种替代方法std::optional?

Cal*_*eth 7

您可以使用就地重载而std::make_optional不是移动重载。

std::optional<ScopedClass> check_and_return(bool condition) {
  if (condition == true)
    return std::make_optional<ScopedClass>(); // constructs ScopedClass in place with the arguments ()
  return std::nullopt;
}
Run Code Online (Sandbox Code Playgroud)