Aggregate initialization要求没有用户提供的构造函数。但std::tuple
和std::pair
对有一大组overloaded constructors。从核心语言的角度来看,这些构造函数是用户提供的,还是用户声明的?
使用C ++ 17可以编写(更新/澄清:其中nocopy是一个无法复制或移动的类,例如std::mutex
)
auto get_ensured_rvo_str(){
return std::pair(std::string(),nocopy());
}
编辑:不,它不可能在链接到答案和下面的答案中解释。
需要聚合初始化(对于上下文:Multiple return values (structured bindings) with unmovable types and guaranteed RVO in C++17)。
tuple
和pair
是否支持特殊标准语言(在构造函数存在的情况下)? :
20.5.2.1施工
... EXPLICIT constexpr元组(const类型& ...);
6 效果: 构造函数使用的值初始化每个元素 相应的参数。
或者我们原则上可以编写自己的tuple
或pair
吗?
答案 0 :(得分:6)
不,tuple
或pair
中没有支持将非移动类型传递给它们的构造函数,并且正如您所观察到的那样,因为构造函数参数和元组(或对) )成员可被视为不同的对象:
// exposition only
template<class... Us>
tuple(Us&&... us) : values{std::forward<Us>(us)...} {}
^^ these
^^^^^^ are different objects to these
你必须使用分段构造:
return std::pair<std::string, nocopy>(std::piecewise_construct,
std::forward_as_tuple(), std::forward_as_tuple());
Matt Calabrese在std-proposal列表上做了一个interesting point,现在我们已经保证了RVO应该可以编写接受工厂的组件来有效地构建他们的成员:
// hypothetical factory constructor
return std::pair(std::factory_construct,
[] { return std::string{}; }, [] { return nocopy{}; });
另一个可能的方向是从tuple
和pair
中移除构造函数(或者更现实地,在没有构造函数的情况下编写类似于工作的组件)并依赖应该允许聚合的new extensions to aggregate initialization通过多重继承实现的tuple
和pair
的初始化。 Example