c++ - 为什么T&&实例化为int&?

标签 c++ templates c++11 forwarding rvalue-reference

谁能解释一下为什么会编译,为什么 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 上看到了这个

最佳答案

因为完美转发,当 P&& 的参数是一个左值时,P 将被推导为参数的类型加上一个 & 附上。所以你得到 int & &&,其中 Pint&。如果参数是右值,则 P 将仅推导为参数的类型,因此您得到一个带有 P 的 int&& 参数int 如果你会通过,例如 0 直接。

int& && 将折叠为 int&(这是语义 View - 从语法上讲 int& && 是非法的。但是说 U && U 是模板参数或引用类型 int& 的 typedef 时,U&& 仍然是类型 int& - 即两个引用“折叠”到一个左值引用)。这就是 t 的类型为 int& 的原因。

关于c++ - 为什么T&&实例化为int&?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4327730/

相关文章:

c++ - 在 C++11 中查找和访问优先级队列中的元素

c++ - 如何调用在 main() 内部但在外部范围内定义的变量

c++ - memset 和 struct 以及 getter/setter

c# - 如何根据默认样式制作圆边按钮样式

c++ - 具有共享指针参数歧义的函数重载

c++ - 为什么这个程序没有打印返回迭代器的正确第二个元素?

C++ Qt 表达式 : _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) error

Bools 错误 : "iterator not dereferencable" when assigning values 的 C++ vector

模板函数的 C++11 奇怪错误

c++ - 将模板类作为参数传递