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());
}
编辑:不,这是不可能的,如答案链接和下面的答案中所述。
这需要聚合初始化(对于上下文:)。
tuple
和 pair
是否由特殊的标准语言支持以允许这样做(在存在构造函数的情况下)? :
20.5.2.1 Construction
...
EXPLICIT constexpr tuple(const Types&...);
6
Effects: The
constructor initializes each element with the value of the
corresponding parameter.
或者原则上我们可以自己写 tuple
或 pair
吗?
不,tuple
或 pair
不支持将不移动类型传递给它们的构造函数,正如您所观察到的那样,不可能,因为构造函数参数和元组 ( 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{}; });
另一个可能的方向是从 tuple
和 pair
中删除构造函数(或者,更现实地说,编写没有构造函数的类似组件)并依赖 new extensions to aggregate initialization that should permit aggregate initialization of tuple
and pair
implemented via multiple-inheritance. Example.
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());
}
编辑:不,这是不可能的,如答案链接和下面的答案中所述。
这需要聚合初始化(对于上下文:
tuple
和 pair
是否由特殊的标准语言支持以允许这样做(在存在构造函数的情况下)? :
20.5.2.1 Construction
... EXPLICIT constexpr tuple(const Types&...);
6 Effects: The constructor initializes each element with the value of the corresponding parameter.
或者原则上我们可以自己写 tuple
或 pair
吗?
不,tuple
或 pair
不支持将不移动类型传递给它们的构造函数,正如您所观察到的那样,不可能,因为构造函数参数和元组 ( 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{}; });
另一个可能的方向是从 tuple
和 pair
中删除构造函数(或者,更现实地说,编写没有构造函数的类似组件)并依赖 new extensions to aggregate initialization that should permit aggregate initialization of tuple
and pair
implemented via multiple-inheritance. Example.