std::make_from_tuple 没有构造函数无法编译
std::make_from_tuple doesn't compile without constructor
我有一个简单的结构:
struct A
{
int a;
int b;
int c;
// A(int a, int b, int c) : a{a}, b{b}, c{c} { }
};
现在对构造函数进行注释。我正在尝试以这种方式创建 A
类型的对象:
auto t = std::make_tuple(1, 2, 3);
A a = std::make_from_tuple<A>(std::move(t));
但它无法编译。 MSVC 给出一条信息:
<function-style-cast>: cannot convert from initializer_list to _Ty
。
在我取消注释 struct A
的构造函数后,它开始工作。
问题是:为什么 std::make_from_tuple()
需要用户定义的构造函数而不是默认构造函数?
如果您仔细查看 standard 中 make_from_tuple
的实现:
namespace std {
template<class T, class Tuple, size_t... I>
requires is_constructible_v<T, decltype(get<I>(declval<Tuple>()))...>
constexpr T make-from-tuple-impl(Tuple&& t, index_sequence<I...>) {
return T(get<I>(std::forward<Tuple>(t))...);
}
}
它使用括号(()
)来初始化T
,直接初始化。由于A
是聚合,在C++17中不能使用括号进行初始化,只能使用花括号({}
)进行列表初始化。
值得注意的是P0960 makes it possible to use parentheses to initialize aggregates in C++20, so your code is well-formed在C++20.
我有一个简单的结构:
struct A
{
int a;
int b;
int c;
// A(int a, int b, int c) : a{a}, b{b}, c{c} { }
};
现在对构造函数进行注释。我正在尝试以这种方式创建 A
类型的对象:
auto t = std::make_tuple(1, 2, 3);
A a = std::make_from_tuple<A>(std::move(t));
但它无法编译。 MSVC 给出一条信息:
<function-style-cast>: cannot convert from initializer_list to _Ty
。
在我取消注释 struct A
的构造函数后,它开始工作。
问题是:为什么 std::make_from_tuple()
需要用户定义的构造函数而不是默认构造函数?
如果您仔细查看 standard 中 make_from_tuple
的实现:
namespace std {
template<class T, class Tuple, size_t... I>
requires is_constructible_v<T, decltype(get<I>(declval<Tuple>()))...>
constexpr T make-from-tuple-impl(Tuple&& t, index_sequence<I...>) {
return T(get<I>(std::forward<Tuple>(t))...);
}
}
它使用括号(()
)来初始化T
,直接初始化。由于A
是聚合,在C++17中不能使用括号进行初始化,只能使用花括号({}
)进行列表初始化。
值得注意的是P0960 makes it possible to use parentheses to initialize aggregates in C++20, so your code is well-formed在C++20.