我想在std::optional
中存储一个不可移动且不可复制的非平凡类型,但该对象由自由函数构造。(示例)
struct Foo {
Foo();
Foo(Foo const&) = delete;
Foo(Foo&&) = delete;
Foo& operator=(Foo const&) = delete; // added for completeness
Foo& operator=(Foo&&) = delete; // added for completeness
~Foo();
};
Foo foo();
在不改变 Foo
或 foo()
的情况下;
由于拷贝省略(copy elision),我已经可以做到这一点:
Foo f1 = foo();
这也可以编译通过,因为std::optional
只需要存储的类型可析构:
std::optional<Foo> f2;
f2.emplace();
但是我无法用函数结果填充f2
:
f2 = foo(); // no
f2.emplace(foo()); // no
显然,这将需要复制或移动 Foo
。 这很可能是不可能的,但我有没有忽略什么?
static_cast<F&&>
?不使用貌似也能工作:https://godbolt.org/z/1nKP513q4 - Solomon Uckostd :: move(f)()
从f
窃取)。 - Artyerstd::forward<F>(f)()
而不是static_cast<F&&>(f)()
。效果相同,但它清楚地表明您正在进行完美转发。其次,请注意,此技术不支持所有类型--该类型不能具有接受call_wrapper<F>
的构造函数。这对于某些行为不良的类型(如C++11的std::function)会发生(后续版本的行为更好)。 - Yakk - Adam Nevraumont