Давайте рассмотрим этот код:
#include <iostream>
#include <variant>
struct Foo {
#if 0
Foo() = default;
Foo(const Foo&) = delete;
#endif
void foo() { std::cout << "foo" << '\n'; }
};
using MyVariant = std::variant<Foo>;
MyVariant& getVariant() {
static MyVariant variant{Foo{}};
return variant;
}
int main() {
auto& variant = getVariant();
auto& foo = std::get<Foo>(variant);
foo.foo();
}
Он компилирует и печатает «foo».
Если вы измените #if 0
на #if 1
, что сделает Foo
не копируемым class, то код больше не компилируется.
Почему я не хочу, чтобы Foo нельзя было копировать? Чтобы избежать ошибок «неожиданные копии» с чем-то вроде auto variant = getVariant();
(обратите внимание, что &
отсутствует по сравнению с исходным кодом).
Я не могу найти правильный синтаксис для этого кода. Может быть, его нет ... Моя цель - выбрать альтернативу при первом вызове функции, и вариант не будет изменен позже (он всегда будет содержать одну и ту же альтернативу).
Что вы предлагаете ? Спасибо!