Агрегатная инициализация требует, помимо прочего, не предоставленных пользователем конструкторов. Но пары std::tuple
и std::pair
имеют большой набор перегруженных конструкторов. С точки основного языка, являются ли эти конструкторы предоставлены пользователем или даже объявлены пользователем?
С С++ 17 можно будет написать (обновить/уточнить: где nocopy - это класс, который нельзя скопировать или переместить, например std::mutex
)
auto get_ensured_rvo_str(){
return std::pair(std::string(),nocopy());
}
изменить: нет, это невозможно, как описано в ответах и ответах ниже.
который требует агрегатной инициализации (для контекста: Множественные возвращаемые значения (структурированные привязки) с неизменяемыми типами и гарантированное RVO в С++ 17).
Есть ли tuple
и pair
, поддерживаемые специальным стандартным языком, чтобы разрешить это (в присутствии конструкторов)?
20.5.2.1 Конструкция
... EXPLICIT constexpr tuple (const Types &...);
6 Эффекты: конструктор инициализирует каждый элемент значением соответствующий параметр.
или мы в принципе можем написать собственные tuple
или pair
?