3

考虑以下代码:

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 上的实时示例


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

4

1 回答 1

7

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

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

添加推导指南也可以在 Clang中编译。

template <typename B> D(B) -> D<B>;
于 2022-01-11T01:51:10.370 回答