【发布时间】:2014-03-04 09:03:18
【问题描述】:
这是function template does not recognize lvalue的后续报道
让我们玩一下下面的代码:
#include <iostream>
template <class T>
void func(T&&) {
std::cout<<"in rvalue\n";
}
template <class T>
void func(const T&) {
std::cout<<"in lvalue\n";
}
int main()
{
double n=3;
func<double>(n);
func(n);
}
打印出来:
in lvalue
in rvalue
我不明白第二次通话中发生了什么。编译器如何 解析模板参数?为什么没有歧义?
【问题讨论】:
-
您不妨参考标准中的14.8.2。模板参数推导是一个有点复杂的主题。关键是选择了“最佳匹配”,并且
T可以推断为引用类型。 -
“有点复杂的主题”!我完全同意。顺便问一下,有没有办法让 g++/clang++ 详细说明它在这里做什么?
-
那个无辜的小部分占据了 15 页,并开发了一个全新的数学符号:-S 但最终它“按照你的想法做”,你只需要在 a 的上下文中接受模板参数作为诚实的类型函数签名。
-
我发现这个链接很有帮助:isocpp.org/blog/2012/11/…
-
不,它不打印日志,或者它的作用。但是模板警告/错误非常冗长,如果这就是您的意思的话。
标签: c++ templates c++11 lvalue rvalue