请考虑以下代码:
template <typename T>
struct dependent_type
{
using type = T;
};
template <typename T>
auto foo(T) -> std::enable_if_t<std::is_same<T, int>{}>
{
std::cout << "a\n";
}
template<typename T>
void foo(typename dependent_type<T>::type)
{
std::cout << "b\n";
}
Run Code Online (Sandbox Code Playgroud)
第一个重载foo可以T从其调用中推断出来.
的第二过载foo是一个非推测的上下文.
int main()
{
foo<int>( 1 ); // prints "b"
foo<double>( 1.0 ); // prints "b"
foo( 1 ); // prints "a"
}
Run Code Online (Sandbox Code Playgroud)
为什么foo<int>( 1 )打印"b"而不是"a"?