C++ 指向右值的指针

C++ 指向右值的指针,c++,shared-ptr,rvalue,C++,Shared Ptr,Rvalue,在寻找调用同时接受左值和右值引用的函数的解决方案时,我编写了以下代码(不,我保证,我再也不会这样做了) 目标是提供一个同时接受左值和右值引用的函数,我不想编写两个函数,也不想真正关心调用方的左值/右值。因此,我考虑提供一些宏/函数来包装参数,以便可以传递它,无论它是l/R值——在本例中是get_addr 在任何情况下,我都不想更改传递给函数的数据 template<typename T> std::shared_ptr<T> get_addr(T t) { std

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

目标是提供一个同时接受左值和右值引用的函数,我不想编写两个函数,也不想真正关心调用方的左值/右值。因此,我考虑提供一些宏/函数来包装参数,以便可以传递它,无论它是l/R值——在本例中是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());
}
模板
标准::共享地址获取地址(T){
std::shared_ptr p(新T(T));
返回p;
}
int get_值(int x){
返回x*2;
}
无效打印值(int*p){
库特
在任何情况下,我都不想更改传递给函数的数据

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());
}
那么这有什么问题

void print_value(int p){
    cout << p << endl;
}
void打印值(int p){
库特
在任何情况下,我都不想更改传递给函数的数据

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());
}
那么这有什么问题

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

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

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

是的,这是我的解决方案。虽然很简单,但我没有看到它。我不知道只要引用参数标记为const,就可以传递右值引用。谢谢!是的,这是我的解决方案。虽然很简单,但我没有看到它。我不知道右值引用可以传递只要引用参数标记为const,就可以传递。谢谢!