下面的代码
#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 。