Con*_*tor 5 c++ templates c++11 template-aliases
以下程序......
#include <iostream>
#include <type_traits>
template <typename T>
struct Template{};
template <typename T>
using Alias = Template<T>;
template
<
template <typename>
class T1,
template <typename>
class T2
>
struct is_same_template : std::false_type{};
template
<
template <typename>
class T
>
struct is_same_template<T, T> : std::true_type{};
int main() {
std::cout << std::boolalpha;
std::cout << "Template == Template: " << is_same_template<Template, Template>::value << std::endl;
std::cout << "Template == Alias: " << is_same_template<Template, Alias>::value << std::endl;
std::cout << "Alias == Alias: " << is_same_template<Alias, Alias>::value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
... ...输出
Template == Template: true
Template == Alias: false
Alias == Alias: true
Run Code Online (Sandbox Code Playgroud)
...使用g ++ 4.8.1,clang 3.4和vc ++ 18.00.21005.1编译.
这是编译器中的错误还是标准的要求?
这是标准所要求的行为,而且完全符合逻辑。别名模板不是模板别名(尽管有些人希望如此)。最初,即使在标准中对此似乎也存在一些混乱,请参阅http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1244。
在当前的标准化形式中,别名模板就像其非模板对应部分一样:它为类型添加别名。在模板版本中,类型可能是相关的。
并且立即被替换。例如,模板参数Alias<T>本身T就是依赖类型Template<T>- 从这个意义上说,名称别名模板可能有点令人困惑,因为它表明在某个时刻将实例化别名声明。但实际上别名模式会立即被替换 - 从这个意义上说,模板化版本更像是始终存在且不需要实例化的依赖别名声明,而不是别名声明模板。
不过,从这一点来看,我们对这些术语的确切含义就变得有点哲学化了。