在GCC,Clang和MSVC中编译类模板参数的特化,但是GCC选择了另一个特化

时间:2019-04-15 12:15:15

标签: c++ templates language-lawyer template-specialization

我在Clang 8.0.0,MSVC v19.20和GCC 8.3中成功编译了以下SSCCE代码段。 MSVC和Clang都会使程序返回0,而GCC会使程序返回1(godbolt),所以两者之间存在差异,我不知道哪个编译器会产生正确的输出。

#include <type_traits>

template<typename T>
struct Foo {
    template <typename U>
    using inner = Foo<U>;
};

template<template<typename ...Ts> typename>
struct is_foo_template : std::false_type {};
template<>
struct is_foo_template<Foo> : std::true_type {};

template<typename T>
struct is_foo : is_foo_template<T::template inner> {};

int main() {
    return is_foo<Foo<int>>::value;
}

我认为该代码段返回is_foo<Foo<Int>>::value,但是值是std::true_type::valuestd::false_type::value取决于是否选择了is_foo_template的Foo专业化。但是,main返回的值对于上述所有三个编译器都不相同,因此在我看来,并非所有编译器都选择相同的专业化。

问题:根据标准,应该选择Foo专业化还是应该选择非专业模板声明?

0 个答案:

没有答案