std::可选构造函数中的默认模板参数

pur*_*ess 2 c++ templates

std::optional有以下构造函数:

template < class U = T >
constexpr optional( U&& value );
Run Code Online (Sandbox Code Playgroud)

这里的问题是:为什么模板参数U默认为 type T?如果简单地将构造函数更改为以下内容会发生什么:

template < class U /* = T */>
constexpr optional( U&& value );
Run Code Online (Sandbox Code Playgroud)

Art*_*yer 6

因此,如果您给它一个初始值设定项列表(它没有类型,因此无法推断 的类型U),它将初始化一个T临时值。

例如:

std::optional<std::vector<int>> opt({1, 2, 3});
// No type deduced for `U`, defaults to `std::vector<int>`

struct X {
    int a, b;
};
std::optional<X> opt({.a = 1, .b = 2});
// Same here
Run Code Online (Sandbox Code Playgroud)