c++ - 与通用引用混淆

标签 c++ c++11

我有这个代码:

void f2(int& lvalue)
{
  std::cout <<"lvalue\n";
}
void f2(int&& rvalue)
{
  std::cout << "rvalue\n";
}

template<typename T>
void f(T&& param)
{
  f2(param);
}

如果我用以下方式调用 f,我希望得到“左值”:

int v = 10;
f(v);

如果我用以下方式调用 f 并期待“右值”:

f(10);

但是,我总是得到左值大小写。拜托,任何人都可以解释我哪里错了。

最佳答案

您需要转发您的参数。虽然 param 的类型可能是右值引用,param本身仍然是一个左值。

f2(std::forward<T>(param));

std::forward确保 param获得与传递的参数相同的引用限定符。这被称为 perfect-forwarding .

如果您调用 f(10) :

  • param是一个左值
  • std::move(param)是一个右值
  • std::forward<T>(param)在右值中

如果您调用 f(v) :

  • param是一个左值
  • std::move(param)是一个右值
  • std::forward<T>(param)在左值

关于c++ - 与通用引用混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31203225/

相关文章:

c++ - 如何用c/c++最方便的处理jpg图片?

c++ - Qt样式表的任意检查

c++ - 调用带有 null 的非虚方法是这种未定义的行为吗?

c++ - c++ shared_ptr中的相互破坏

c++ - constexpr 函数不需要返回常量表达式吗?

c++ - static combinable<T> 可以用作 thread_local 的占位符吗?

c++ - 为什么空字符串可以在 C++ 中输出索引 0 元素

c++ - 如何有效地解析 C++ 中的大数据 json 文件(wikidata)?

c++ - "Downcasting"unique_ptr<Base> 到 unique_ptr<Derived>

c++ - 防止通过引用传递右值