Joh*_*erg 8 c++ tuples aggregate std-pair c++17
聚合初始化除其他外不需要用户提供的构造函数.但是std::tuple,std::pair对有一大堆重载的构造函数.从核心语言的角度来看,这些构造函数是用户提供的还是用户声明的?
使用C++ 17,可以编写(更新/澄清:nocopy是一个无法复制或移动的类,例如std::mutex)
auto get_ensured_rvo_str(){
return std::pair(std::string(),nocopy());
}
Run Code Online (Sandbox Code Playgroud)
编辑:不,这是不可能的,如链接答案和下面的答案所解释.
这需要聚合初始化(对于上下文:具有不可移动类型的多个返回值(结构化绑定)和C++中保证的RVO 17).
是tuple与pair特殊标准语言的支持,让这(在构造函数中的存在)?:
20.5.2.1施工
... EXPLICIT constexpr元组(const类型&...);
6效果:构造函数使用相应参数的值初始化每个元素.
或者我们原则上可以自己编写tuple或者pair?
不,没有支持tuple或pair将非移动类型传递给它们的构造函数,并且正如您所观察到的那样,因为构造函数参数和元组(或对)成员可以被观察为不同的对象:
// exposition only
template<class... Us>
tuple(Us&&... us) : values{std::forward<Us>(us)...} {}
^^ these
^^^^^^ are different objects to these
Run Code Online (Sandbox Code Playgroud)
你必须使用分段构造:
return std::pair<std::string, nocopy>(std::piecewise_construct,
std::forward_as_tuple(), std::forward_as_tuple());
Run Code Online (Sandbox Code Playgroud)
Matt Calabrese 在std-proposal列表上提出了一个有趣的观点,现在我们已经保证了RVO应该可以编写接受工厂的组件来有效地构建他们的成员:
// hypothetical factory constructor
return std::pair(std::factory_construct,
[] { return std::string{}; }, [] { return nocopy{}; });
Run Code Online (Sandbox Code Playgroud)
另一种可能的方向将是从取出的构造tuple和pair(或,更实际地,写workalike组件而不构造函数),并依赖于新的扩展聚集初始化应该允许的集合初始化tuple和pair经由多继承实现.例子.