【问题标题】:pointer to rvalue指向右值的指针
【发布时间】:2012-03-23 23:33:12
【问题描述】:

在寻找调用同时接受左值和右值引用的函数的解决方案时,我编写了以下代码(不,我保证不会再这样做了)。

目标是提供一个同时接受左值和右值引用的函数,我不想编写两个函数或真正关心调用方的左值/右值。因此,我想提供一些包装参数的宏/函数,以便可以传递它是否是 l/rvalue - 在本例中为 get_addr。

在任何情况下,我都不想更改传递给函数的数据。

template<typename T>
std::shared_ptr<T> get_addr(T t) {
    std::shared_ptr<T> p(new T(t));
    return p;
}

int get_value(int x){
    return x * 2;
}

void print_value(int* p){
    cout << *p << endl;
}

int main() {
    print_value(get_addr(get_value(42)).get());
}

虽然该代码对我来说运行良好,但我怀疑它是否安全。我的猜测:从 shared_ptr 调用 get() 后,get_value() 的结果不再是必需的,可能会被忽略。因此, print_value 可能会收到无效的引用。那有意义吗?无论如何,我不喜欢我提供的代码。我通过使用临时变量解决了这个问题。

尽管如此,我仍然很好奇这个问题是否有更好的解决方案。从语法的角度来看,我最好只有一个函数“void print_value(int&& p)”接受两个 l/rvalues。我查看了移动语义、左/右值转换,但没有找到真正看起来不错的解决方案。

【问题讨论】:

    标签: c++ shared-ptr rvalue


    【解决方案1】:

    首先,您可以只使用const T&amp;,它将绑定到 l 和 r 值。不过,更直接的说,“完美转发”就是解决这个问题的办法。

    【讨论】:

      【解决方案2】:

      在任何情况下,我都不想更改传递给函数的数据。

      那么这有什么问题呢?

      void print_value(int p){
          cout << p << endl;
      }
      

      或者以下,如果你不想复制一些昂贵的类型。

      void print_value(T const& p){
          cout << p << endl;
      }
      

      【讨论】:

      • 是的,这就是我的解决方案。虽然很简单,但我没有看到。我不知道只要引用参数标记为 const,就可以传递右值引用。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多