Предположим, у меня есть очень ограничительный класс, отвечающий этому требованию:
Код: Выделить всё
struct R
{
R(const R&) = delete;
R& operator=(const R&) = delete;
R(R&&) = delete;
R& operator=(R&&) = delete;
// This works thanks to guaranteed copy elision since C++17.
static R create()
{
return R();
}
private:
R() = default;
};
Код: Выделить всё
void test_1()
{
R obj = R::create();
/* use obj */
}
Следующий код явно не работает, поскольку все конструкторы R недоступны:
Код: Выделить всё
void test_2()
{
std::optional o(R::create()); // Error: no matching constructor
}
Изменить:
Не будет было бы неплохо, если бы у std::optional был конструктор, который принимал бы построитель?
Код: Выделить всё
template
optional::optional(disabmiguating_tag, Builder f)
: my_internal_union(f())
{
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... le-nor-mov
Мобильная версия