模板别名的相等

时间:2019-05-06 18:35:58

标签: c++ language-lawyer template-templates using-declaration

我尝试创建无法与原始别名区分开的模板别名。

因此,我创建特征以检查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

Demo

是否可以创建“ true”别名? 哪个编译器是正确的?

1 个答案:

答案 0 :(得分:5)

  

我尝试创建无法与原始别名区分开的模板别名。

我认为目前尚不可能。 (不幸的是)没有模板别名,只有别名模板。别名模板始终是其自己的[temp.alias]/1的模板。别名模板的特殊化等效于通过将模板参数替换为别名模板而获得的类型,但是别名模板本身不是另一个模板[temp.alias]/2的别名。我会考虑让GCC让您的第二个static_assert通过GCC中的错误……

正如@HolyBlackCat在上面的评论中指出的,a related question and answer指出了许多相关的CWG问题。特别是一个问题(CWG 1286)似乎暗示着希望让别名模板本身等同于在某些情况下它引用的模板。但是,由于稍后提出的关注,似乎未通过建议的决议。当前的标准草案([temp.alias][temp.type])中的相关措辞似乎与C ++ 11相同。