Могу ли я иметь std::optional, если T не является ни конструируемым, ни копируемым, ни перемещаемым?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Могу ли я иметь std::optional, если T не является ни конструируемым, ни копируемым, ни перемещаемым?

Сообщение Anonymous »

Единственное требование для ввода параметра шаблона класса std::optional, упомянутого в [optional.optional.general] p3, заключается в том, что тип T должен быть разрушимым .
Предположим, у меня есть очень ограничительный класс, отвечающий этому требованию:

Код: Выделить всё

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 */
}
Вопрос: могу ли я действительно иметь полезный объект типа std::optional? Под «пригодным к использованию» я подразумеваю объект, который содержит ценность. Если да, то как мне создать там это значение?
Следующий код явно не работает, поскольку все конструкторы R недоступны:

Код: Выделить всё

void test_2()
{
std::optional o(R::create());   // Error: no matching constructor
}
Ссылка на пример Godbolt.

Изменить:
Не будет было бы неплохо, если бы у std::optional был конструктор, который принимал бы построитель?

Код: Выделить всё

template 
optional::optional(disabmiguating_tag, Builder f)
: my_internal_union(f())
{
}
конечно, с соответствующим конструктором my_internal_union...

Подробнее здесь: https://stackoverflow.com/questions/791 ... le-nor-mov
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»