作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
下面的程序...
#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;
}
...输出...
Template == Template: true
Template == Alias: false
Alias == Alias: true
...使用 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>
- 从这个意义上说,alias template 名称可能有点令人困惑,因为它暗示在某个时候将实例化别名声明。但实际上别名模式会立即被替换——从这个意义上说,模板化版本更像是一个始终存在且不需要实例化的依赖别名声明,而不是别名声明模板。
不过,就此而言,我们对这些术语的确切含义变得有点哲学化。
关于c++ - is_same_template 在模板别名上的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22892052/
下面的程序... #include #include template struct Template{}; template using Alias = Template; template
我是一名优秀的程序员,十分优秀!