Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板别名上的is_same_模板的奇怪行为_C++_Templates_C++11_Template Aliases - Fatal编程技术网

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请求模板别名,如
。你的建议很有趣。我会努力实现的。
Template == Template: true
Template == Alias: false
Alias == Alias: true