c++ - 左值的正确引用

标签 c++ c++11

右值什么时候成为左值的正确引用?

示例如下,应该用std::forward解决:

void g(int && v1, int & v2)
{
    std::cout << v1 << " " << ++v2 << std::endl;
}

template <typename F, typename T1, typename T2>
void flip(F f,T1 && t1, T2  && t2){
    g(t2, t1);
}

调用时发生错误,如下所示:

flip(g, j, 2);

我的问题是: 在 flip(g, j 2) 中,第三个参数 2 是右值。
在函数flip中,参数t2是2上的右引用。当调用g时,似乎t2是对左值的正确引用。
通过引用接收的右值(没有复制?)在什么时候变成了左值?

示例如下:https://ideone.com/cJvFCg

最佳答案

这是"if it has a name"规则说,在这样的代码中,如果变量有一个名称(在本例中为您的 t2),那么此时它就成为左值。 (另请参阅斯科特·迈耶斯 Effective Modern C++。)

为了保留调用者的原始意图,您确实可以使用 perfect forwarding :

g(std::forward<T2>(t2), ...)

关于c++ - 左值的正确引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30760638/

相关文章:

c++ - 如何从另一个类中的私有(private)指针指向的类中获取私有(private)信息?

c++ - url 属性的rapidxml 解析错误

c++ - 我无法正确删除 vector 中的元素

c++ - 跨平台线程亲和函数

c++ - TGA 文件头在 Windows 上不正确

c++ - 线程上的 Boost.Asio 并发问题

c++ - 为什么 std::ratio 不支持比较运算符?

c++ - 确定动态内存分配中 char 指针的最大容量

c++ - cuda 内存分配 cudaMalloc

c++ - 如何为 Debug模式优化大循环