【发布时间】:2015-09-03 06:56:40
【问题描述】:
昨天我问a question about when to use std::forward and when to use std::move
今天我试图应用我认为我学到的东西。我写了以下内容:
template <typename T>
void exp(T a, T b)
{
cout << "rvalues" << endl;
}
template <typename T>
void exp(T& a, T& b)
{
cout << "lvalues" << endl;
}
template <typename T>
void foo(T&& a, T&& b)
{
exp(forward<T>(a), forward<T>(b));
}
当我在main 中调用foo(4, 5) 时,它会打印出"rvalue",正如我所期望的那样,但是当我执行类似的操作时
int a = 0, b = 0;
foo(a, b);
发生错误:'exp' : ambiguous call to overloaded function
我在这里缺少什么?为什么最后一次调用foo(a, b) 没有调用void exp(T& a, T& b) 函数?
【问题讨论】:
-
你会选择什么函数?
-
在我看来,当我调用
foo(a, b)时,我认为程序应该选择void exp(T& a, T& b)函数。无论如何,我用另一个问题编辑了描述,谢谢! -
为什么不
void exp(T, T)? -
因为
a和b是左值引用,forward将保留exp的左值引用... -
没有一个重载比另一个重载更专业,并且两者都适用于左值参数