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