std :: tuple和std :: pair是否支持聚合初始化?

时间:2016-07-15 09:02:53

标签: c++ tuples aggregate std-pair c++17

Aggregate initialization要求没有用户提供的构造函数。但std::tuplestd::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)。

tuplepair是否支持特殊标准语言(在构造函数存在的情况下)? :

  

20.5.2.1施工

     

...   EXPLICIT constexpr元组(const类型& ...);

     

6   效果:   构造函数使用的值初始化每个元素   相应的参数。

或者我们原则上可以编写自己的tuplepair吗?

1 个答案:

答案 0 :(得分:6)

不,tuplepair中没有支持将非移动类型传递给它们的构造函数,并且正如您所观察到的那样,因为构造函数参数和元组(或对) )成员可被视为不同的对象

// 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{}; });

另一个可能的方向是从tuplepair中移除构造函数(或者更现实地,在没有构造函数的情况下编写类似于工作的组件)并依赖应该允许聚合的new extensions to aggregate initialization通过多重继承实现的tuplepair的初始化。 Example