C++模板别名的等价性

Sas*_*sha 2 alias templates using c++11

假设我有一个模板:

template<typename T>
struct Foo {int f1, f2;};
Run Code Online (Sandbox Code Playgroud)

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

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

// Instead do like this:
template<typename T>
using Bar = Foo<T>;
Run Code Online (Sandbox Code Playgroud)

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

// 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"
Run Code Online (Sandbox Code Playgroud)

似乎f <Foo>和f <Bar>是f的不同特化!

所以:

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

谢谢.

Joh*_*itb 5

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

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

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

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

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