类模板适用于 gcc 和 msvc,但不适用于 clang

Ala*_*lan 0 c++ aggregate language-lawyer c++20

我通过 Stanley 的《C++ Primer》一书了解了 C++ 中的类模板。然后我编写了以下程序,令人惊讶的是,它可以使用 gcc 编译,但不能使用 clang 编译。我不知道为什么会这样。也就是说,C++20 中哪个编译器是正确的。我还阅读了有关未定义行为的信息,但我不确定该程序是否具有该行为。

template <typename T>
struct test
{
    T y;
};  

int main()
{
    test t{1};   //compiles with gcc and msvc but not with clang!  
}
Run Code Online (Sandbox Code Playgroud)

那么有人可以告诉我根据 C++20 标准什么是正确的行为吗?

演示

use*_*570 5

该程序在 C++20 中格式良好,因为有一个聚合推导指南(候选) template<typename T> test(T) -> test<T>;,它将隐式生成/考虑用于推导模板参数,因此应在 C++20 的示例中推导T结果向前。Tint

该功能是在P1816R0中引入的,clang 尚未实现,如下表所示:

C++20 功能 文件) 海湾合作委员会 MSVC
聚合的类模板参数推导 P1816R0 10 19.27*

从上表中可以看出,相应行中没有 clang 条目,这意味着 clang 尚未实现此功能,而 gcc 和 msvc 分别从版本 10 和 19.27 开始支持此功能。


解决方案

为了使这项工作与 clang 一起工作,您可以显式添加推导指南,如下所示:

template <typename T>
struct test
{
    T y;
};  
//use this deduction guide
template<typename T> test(T) -> test<T>;
int main()
{
    test t{1};   now works with all compilers
}
Run Code Online (Sandbox Code Playgroud)