【问题标题】:Choose function declaration with lvalue or rvalue parameter选择带有左值或右值参数的函数声明
【发布时间】:2013-04-06 18:50:53
【问题描述】:

有没有办法删除我所有函数的“plumb”版本,而无需将“hit”行更改为“fixed”?

是的,我的程序运行良好,但我认为是否有办法从这个版本的所有功能中获得乐趣。

请记住,int 在我的程序中并不是真正的int,而是可以是对象(例如container_reference<std::array<double,4>>)或引用(例如std::array<double,4> &)的类型别名

void func(int &&m) { cout << "rvalue: " << m << endl; }
void func(int  &m) { cout << "lvalue: "; func(std::move(m)); } // PLUMB!

int main() 
{
    int a = 5;
    func(a);    // HIT!
    func(std::move(a)); // FIXED!
    func(6);
    func(a + 5);
}

【问题讨论】:

  • 我觉得你并没有真正理解你在做什么。所以问题是你想做什么?你想让你的func 使用右值还是左值?
  • 我想同时工作。但是body代码是完全一样的。

标签: c++ rvalue-reference lvalue


【解决方案1】:

我很难准确理解您想要什么,但这可能是一个选择:

template<typename T>
void func(T &&m) {
  // ...
}

T&amp;&amp; 被称为“通用引用”,因为引用折叠规则将绑定到左值和右值。

【讨论】:

  • 通用参考仅适用于模板参数,对吗?所以template&lt;typename T&gt; void func&lt;T &amp;&amp;m) 抓住了一切。但是void func(int &amp;&amp;m) 只捕获右值。
  • @Chameleon 是的,它需要推导类型。我不小心有auto&amp;&amp;,但我的意思是T&amp;&amp;auto&amp;&amp; 在其他地方也可以使用,因为它也被推断出来了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
相关资源
最近更新 更多