У меня есть следующая простая структура:
struct X
{
X(std::string name, int value): name_(name), value_(value){}
std::string name_;
int value_;
};
Я хотел бы использовать его с необязательным усилением без копирования. Вот один из вариантов:
boost::optional<X> op;
op.emplace("abc", 5);
Возможно ли это без использования функции emplace? (я имею в виду однострочное выражение)





Да, просто создайте его с помощью тега «на месте», который перенаправляет аргументы ctor!
boost::optional<X> op(boost::optional::in_place_init, "abc", 5);
(ссылка)
FWIW, если вы не возражаете против движения, это тоже работает:
boost::optional<X> op(X("abc", 5));
Отсканируйте эту справочную страницу; есть множество способов построить или заполнить boost::optional.
boost::Optional<X> op(X("abc", 5)); использует конструктор копирования
@Ирбис Почему? Существует optional<T>::optional( T&& v ) ctor с задокументированной семантикой перемещения (см. связанную ссылку), и аргумент здесь является временным (и, следовательно, rvalue).
Ты прав. Я определил ctor копирования, чтобы увидеть, вызывается ли он, и конструктор перемещения не был сгенерирован. Когда я определяю копировать и перемещать ctor, я вижу, что вызывается move ctor.
Твой нос - это справочная страница