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() 需要用户定义的构造函数而不是默认构造函数?

如果您仔细查看 standardmake_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.