我在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::value
或std::false_type::value
取决于是否选择了is_foo_template
的Foo专业化。但是,main
返回的值对于上述所有三个编译器都不相同,因此在我看来,并非所有编译器都选择相同的专业化。
问题:根据标准,应该选择Foo专业化还是应该选择非专业模板声明?