C++ 模板别名上的is_same_模板的奇怪行为
以下程序C++ 模板别名上的is_same_模板的奇怪行为,c++,templates,c++11,template-aliases,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, t
#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;
}
…使用g++4.8.1、clang 3.4和vc++18.00.21005.1编译
这是这些编译器中的错误还是标准的要求?这是标准要求的行为,也是完全合乎逻辑的。别名模板不是模板别名(尽管有些人打算这样做)。最初,甚至在标准中似乎也存在一些混淆,请参见 在当前标准化的表单中,别名模板类似于它的非模板计数器部分:它为类型添加别名。在模板版本中,类型可能是依赖的 它立即被替换。例如,
Alias
,如果T
本身是一个模板参数,则依赖类型将是template
——从这个意义上讲,别名模板的名称可能有点混淆,因为它表明在某个点上会实例化别名声明。但实际上,别名模式会立即被替换——从这个意义上说,模板化版本更像是始终存在且不需要实例化的依赖别名声明,而不是别名声明模板
在这一点上,我们对这些术语的确切含义就有点哲学化了。您的预期输出是什么?@JohnZwinck
true/true/true
当然,因为它适用于类型别名和std::is_same
。尝试将添加到模板中的typename
中。现在添加templatefoo
和bar=foo
。如果的模板是相同的
?@Yakk我认为在这种情况下,程序应该输出false
(确实如此)。但在您的示例模板中,模板及其别名的参数计数甚至不相等。在这种情况下,它们怎么可能是等价的?你这是什么意思?这对我来说并不奇怪。。。只有别名模板的专门化是类型别名。别名模板本身是一个独特的模板。请参阅[temp.alias]和感谢中的讨论。因此得出的结论是,在当前版本的标准中,模板的typedef
的完全相似性缺失了(我指的是一些简单的情况,比如模板的确切同义词,比如template using Alias=template;
),不是吗?这个问题有没有已知的解决方法?@Constructor没有解决方法。您可以使用Alias=template请求模板别名,如如果您希望获得std提案,请使用code>。你的建议很有趣。我会努力实现的。
Template == Template: true
Template == Alias: false
Alias == Alias: true