0

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

目标是提供一个同时接受左值和右值引用的函数,我不想编写两个函数或真正关心调用方的左值/右值。因此,我想提供一些包装参数的宏/函数,以便可以传递它是否是 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。我查看了移动语义、左/右值转换,但没有找到真正看起来不错的解决方案。

4

2 回答 2

4

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

那这有什么问题呢?

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

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

void print_value(T const& p){
    cout << p << endl;
}
于 2012-03-06T13:31:37.037 回答
2

首先,您可以只取const T&,它将绑定到 l 和 r 值。然而,更直接地说,“完美转发”是解决这个问题的方法。

于 2012-03-06T13:32:40.173 回答