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

Do std::tuple and std::pair support aggregate initialization?

Aggregate initialization requires among other things no user-provided constructors. But std::tuple and std::pair pair have a large set of overloaded constructors。从核心语言的角度来看,这些构造函数是 user-provided 还是 user-declared ?

用C++17可以这样写(update/clarification:其中nocopy是一个不能复制或移动的class,比如std::mutex)

auto get_ensured_rvo_str(){
   return std::pair(std::string(),nocopy());
}

编辑:不,这是不可能的,如答案链接和下面的答案中所述。

这需要聚合初始化(对于上下文:)。

tuplepair 是否由特殊的标准语言支持以允许这样做(在存在构造函数的情况下)? :

20.5.2.1 Construction

... EXPLICIT constexpr tuple(const Types&...);

6 Effects: The constructor initializes each element with the value of the corresponding parameter.

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

不,tuplepair 不支持将不移动类型传递给它们的构造函数,正如您所观察到的那样,不可能,因为构造函数参数和元组 ( or 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-proposals 列表上提出了一个 interesting point 现在我们已经保证 RVO 应该可以编写接受工厂的组件来有效地构建它们的成员:

// hypothetical factory constructor
return std::pair(std::factory_construct,
    [] { return std::string{}; }, [] { return nocopy{}; });

另一个可能的方向是从 tuplepair 中删除构造函数(或者,更现实地说,编写没有构造函数的类似组件)并依赖 new extensions to aggregate initialization that should permit aggregate initialization of tuple and pair implemented via multiple-inheritance. Example.