clang vs gcc - 从模板参数派生的结构体的 CTAD

clang vs gcc - CTAD of struct deriving from template parameter

提问人:Vittorio Romeo 提问时间:1/11/2022 最后编辑:cigienVittorio Romeo 更新时间:1/11/2022 访问量:310

问:

请考虑以下代码:

template <typename B>
struct D : B { };

D d{[]{ }};
  • GCC 12.x 接受它并推断出符合预期。dD</* type of lambda */>

  • Clang 14.x 拒绝它,并显示以下错误:

<source>:4:3: error: no viable constructor 
              or deduction guide for deduction of template arguments of 'D'
D d{[]{ }};
  ^

<source>:2:8: note: candidate template ignored: 
              could not match 'D<B>' against '(lambda at <source>:4:5)'
struct D : B { };
       ^

<source>:2:8: note: candidate function template not viable: 
              requires 0 arguments, but 1 was provided

godbolt.org 上的实时示例


哪个编译器在这里表现正确?

C++ 语言-律师 C++20 CTAD 演绎指南

评论

0赞 dfrib 1/11/2022
相关/近乎重复:C++ 中聚合括号初始化的模板参数推导

答:

8赞 cigien 1/11/2022 #1

在代码片段中,没有提供演绎指南。P1816 通过要求生成聚合推导候选项,为 C++20 中的聚合类模板添加了推导指南。

代码是有效的,但 Clang 还不支持 P1816

添加演绎指南也允许它在 Clang 中编译

template <typename B> D(B) -> D<B>;