【发布时间】:2017-05-28 20:04:22
【问题描述】:
考虑以下代码:
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";
}
foo的第一个重载可以从其调用中推断出T。foo的第二个重载是 non-deduced context。
int main()
{
foo<int>( 1 ); // prints "b"
foo<double>( 1.0 ); // prints "b"
foo( 1 ); // prints "a"
}
为什么foo<int>( 1 ) 打印的是“b”而不是“a”?
【问题讨论】:
-
我猜答案是“b 更专业,所以如果可能的话总是被调用”,原因可能在某个地方 here(它从页面的中间开始)。不过这对我来说有点多。
-
确实是个好问题。谢谢你。 +1
-
下次,我建议将代码发布为单个 sn-p,以便人们可以复制/粘贴一次,而不必复制/粘贴两次才能尝试您的代码(并且要么具有正确的包含指令,要么以不同的方式演示所选重载)。
-
@JohannesSchaub-litb:只需点击“魔杖盒示例”?
-
我不知道那个链接去哪里了。一开始我什至没有发现它。我想对于不熟悉“在线编译器”概念的用户来说,它一定像“我的壁纸收藏”链接一样令人困惑。
标签: c++ templates c++14 language-lawyer overload-resolution