任何人都可以解释为什么这会编译,为什么t
会以int&
类型结束?
#include <utility>
void f(int& r)
{
++r;
}
template <typename Fun, typename T>
void g(Fun fun, T&& t)
{
fun(std::forward<T>(t));
}
int main()
{
int i = 0;
g(f, i);
}
我在GCC 4.5.0 20100604和GDB 7.2-60.2
上看到了这一点答案 0 :(得分:17)
由于完美转发,当P&&
的参数为左值时,P
将推断为参数的类型加上&
。因此,当int & &&
为P
时,您获得int&
。如果参数是右值,则P
将仅推导为参数的类型,因此将获得int&&
参数,其中P
为int
如果你愿意直接传递,例如0
。
int& &&
将崩溃为int&
(这是语义视图 - 语法int& &&
是非法的。但U &&
是U
是模板参数或一个typedef引用类型int&
,然后U&&
仍然是类型int&
- 即两个引用“折叠”到一个左值引用)。这就是t
类型为int&
的原因。
答案 1 :(得分:3)
如果由于某种原因你真的想特别绑定到左值或右值,请使用元编程:
#include <type_traits>
template <typename T>
typename std::enable_if<std::is_lvalue_reference<T&&>::value, void>::type
fun(T&& x)
{
std::cout << "lvalue argument\n";
}
template <typename T>
typename std::enable_if<std::is_rvalue_reference<T&&>::value, void>::type
fun(T&& x)
{
std::cout << "rvalue argument\n";
}
int main()
{
int i = 42;
fun(i);
fun(42);
}