【发布时间】:2012-07-24 02:09:52
【问题描述】:
我有 2 个重载函数 - 一个采用 L 值,另一个采用 R 值。目的是使函数可以像这样调用:
Obj obj;
foo(obj);
或者:
foo(Obj());
所以,我写了两个重载函数:
template <class T>
void foo(T& v)
{
/* ... function body code goes here ... */
}
template <class T>
void foo(T&& v)
{
foo(v);
}
int main()
{
foo(int(5));
}
R 值重载只需要委托给 L 值重载。按照我的理解,一旦我进入函数体,任何使用v 都会给我一个L 值参考,除非我特别使用std::move 或std::forward。所以在 R 值重载中调用 foo(v) 应该会自动调用 L 值版本(而不是递归)。
但是,编译器抱怨歧义:
test.cpp: In function ‘void foo(T&&) [with T = int]’:
test.cpp:305:12: instantiated from here
test.cpp:299:2: error: call of overloaded ‘foo(int&)’ is ambiguous
我不明白为什么这是模棱两可的。在 R 值重载中对 foo() 的调用应该清楚地调用 L 值版本。那为什么不编译呢?
【问题讨论】:
标签: c++ c++11 rvalue-reference