为什么 GCC 编译器不能以别名模板形式从 std::array 推导出模板参数之一

Des*_*old 5 c++ language-lawyer template-aliases c++20 ctad

在 C++20 中,如果应用别名模板,则可以具有隐式推导指南。

然后,我构建了一个简单的模板别名ints

template <std::size_t N>
using ints = std::array<int, N>;
Run Code Online (Sandbox Code Playgroud)

但:

ints{1, 2, 3, 4}
Run Code Online (Sandbox Code Playgroud)

不起作用,GCC 说:

  • 错误:没有匹配的函数可供调用array(int, int, int, int)
  • 注意:无法推断出模板参数N
  • 注意:类型不匹配std::array<int, N>int

我不明白为什么它无法编译。

和:

template <typename T>
using array_of_4 = std::array<T, 4>;
Run Code Online (Sandbox Code Playgroud)

array_of_4{1, 2, 3, 4}
Run Code Online (Sandbox Code Playgroud)

也行不通。

  • 难道是因为std::array它的推演指南是用户提供的?
  • 如果上述答案不成立,那么原因是什么?

我发现了一个关于这个问题的类似问题:How to write deductionguides for aliases ofaggregate templates?

结论是,按照标准,该代码应该是格式良好的。因此,GCC 可能有不同的实现来阻止此代码的编译。

eer*_*ika 0

ints{1, 2, 3, 4}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它无法编译。

您没有指定模板参数。这有效:

ints<4>{1, 2, 3, 4}
Run Code Online (Sandbox Code Playgroud)
array_of_4{1, 2, 3, 4}
Run Code Online (Sandbox Code Playgroud)

也行不通。

同样的问题。这有效:

array_of_4<int>{1, 2, 3, 4}
Run Code Online (Sandbox Code Playgroud)

std::array的推导指南是用户提供的?

是的。

  • 我认为问题是为什么 `std::array a {1, 2, 3, 4};` 可以工作,但 `ints a {1, 2, 3, 4};` 不行?在这两种情况下,编译器应该能够将类型推导为“std::array&lt;int,4&gt;”。 (3认同)
  • 那么,在这种情况下,这是否会违背 CTAD 的目的呢?我不知道 (2认同)