模板别名的平等

Equality of template aliases

本文关键字:别名      更新时间:2023-10-16

我尝试创建无法区分的模板别名。

所以,我创建特征以检查何时2个模板(不是类型(相等的:

template <template <class...> class C1,
          template <class...> class C2>
struct is_same_template : std::false_type {};
template <template <class...> class C1>
struct is_same_template<C1, C1> : std::true_type {};

现在测试它:

// Expected alias
template <typename ... Ts> using V_Ts = std::vector<Ts...>;    // Variadic
// Fallback alias
template <typename T, typename A> using V = std::vector<T, A>; // Exact count
static_assert(!is_same_template<std::vector, V_Ts>::value); // Alias rejected by gcc/clang
static_assert( is_same_template<std::vector, V>::value);    // Alias accepted only for gcc

演示

是否可以创建"真"别名?哪个编译器是对的?

我尝试创建模板别名,该模板是无法区分的。

我认为目前不可能。(不幸的是(没有模板别名,只有别名模板。别名模板始终是其自己的[temp.alias]/1的模板。别名模板的专业化相当于通过将模板参数替换为别名模板而获得的类型,但是别名模板本身并不是另一个模板[temp.alias]/2的别名。我会考虑GCC让您的第二个static_assert通过GCC&Hellip;

中的错误

@holyblackcat在上面的评论中指出,有一个相关的问题和答案指出了许多相关的CWG问题。特别是一个问题(CWG 1286(似乎表明,愿意允许别名模板本身与在某些情况下所指的模板相同。但是,由于稍后提出的担忧,似乎并没有采用拟议的决议。当前标准草稿中的相关措辞([temp.alias]和[temp.type](似乎从C 11…

中没有变化。