模板模板参数不匹配

Bul*_*net 9 c++

下面的代码

#include <cstdint>

template<typename  T>
struct allo{};

template <typename T,  std::size_t a  = alignof(T)>
struct AA{
    constexpr std::size_t align() { return a; }
};

template<template <typename> typename AT>
struct SAR{
};

using UHR = SAR<allo>;

using AHR = SAR<AA>;


int main()
{
    UHR u;
    AHR a;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

被 GCC 使用 接受-std=c++17,但被 GCC 使用std=c++14和 clang 拒绝(无论 C++ 方言如何)。

https://godbolt.org/z/xaE56Y5Pj

哪个编译器是正确的?这是 C++17 中 clang 尚未实现的一些更改吗?

Qui*_*mby 10

在 C++17 之前,模板模板参数必须使用class而不是typename. 在 C++17 中,此限制被取消,并且关键字在这种情况下是等效的。

您的问题实际上是AA有两个模板参数,并且您尝试将其绑定为AT一个。C++17 允许具有 N 个非默认参数的模板与总共具有 N 个参数的模板具有相同的作用。但默认情况下clang 尚未实现它,您可以-frelaxed-template-template-args根据答案使用 flag 。