【问题标题】:Equality of template aliases模板别名的相等性
【发布时间】:2019-09-24 09:52:08
【问题描述】:

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

所以,我创建了特征来检查 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

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

【问题讨论】:

  • "哪个编译器是对的?"你用的是什么编译器?
  • 两条静态断言行上的 cmets 与我在 gcc.godbolt 演示中看到的不匹配。一方面,在demo中这两行颠倒了,static_assert(!is_same_template&lt;std::vector, V_Ts&gt;::value);这行被gcc 8.3和clang 8.0.0都接受了。那条线还有其他我没有看到的问题吗?
  • @DavidDalcino:断言通过,所以模板不同,所以别名被“拒绝”。
  • 应该有更多的解释,你做了什么,你使用了哪些工具......

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


【解决方案1】:

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

我认为目前这是不可能的。 (不幸的是)没有模板别名,只有别名模板。别名模板始终是它自己的模板[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 没有变化……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多