C ++模板别名的等价性

时间:2013-12-14 14:37:10

标签: templates c++11 alias using

假设我有一个模板:

template<typename T>
struct Foo {int f1, f2;};

我想为它创建一个新的别名。

// This will not work, don't even try:
// using Foo = Bar;

// Instead do like this:
template<typename T>
using Bar = Foo<T>;

WOW。它似乎工作。首先。 但是......如果我有这样的功能:

// Generic f:
template<template<typename> class Tpl>
void f() {std::cout<<"Generic f"<<std::endl;}

// Specialization of f for Foo:
template<> void f<Foo>() {std::cout<<"f<Foo>"<<std::endl;}

int main() {...; f<Bar>(); ...} //outputs "Generic f"

似乎f&lt; Foo&gt;和f&lt; Bar&gt;是f的不同专业!

所以:

  1. 这是GCC 4.8错误,还是C ++ 11标准设计漏洞,或者预计是这样?
  2. 有没有办法在C ++ 11中创建“真正的”模板别名?在C ++ 14中? C ++ 17?
  3. 谢谢。

1 个答案:

答案 0 :(得分:5)

  

这是GCC 4.8的错误,还是C ++ 11的标准设计缺陷,或者预计是这样?

预计会如此。实际上,具有讽刺意味的是,标准(草案)最初包含了一些示例,这些示例表明了像您这样的示例。但是规范性文本并没有允许这样做,而且修改了这个例子以便不再提出这个问题。

请参阅http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1244

  

有没有办法在C ++ 11中创建“真正的”模板别名?在C ++ 14?

没有。决定这是一般别名模板的一个非常特殊的情况,如果在讨论上述链接问题时,应该使用直接表达别名的更清晰的语法来解决这个问题。别名模板最终产生类型(并且模仿类型/“typedef”)并且不是“模板别名”,就像它们在早期绘图中的某些时候被调用一样。