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 标准什么是正确的行为吗?
该程序在 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)