Получение адреса значения - PullRequest
3 голосов
/ 20 марта 2012
class MyClass {
    public: MyClass(int a) : a(a) { }
    int a;
};

#include <iostream>
void print(MyClass* a) { std::cout << a->a << std::endl; }

int main() {
    print(&static_cast<MyClass&&>(MyClass(1337)));
    return 0;
}

Это не работает с GCC 4.6, хотя раньше оно работало в предыдущей версии.

Теперь написано: получение адреса xvalue (ссылка на rvalue).

Есть ли способ безопасно передать адрес значения в другую функцию?

Ответы [ 3 ]

3 голосов
/ 20 марта 2012

есть: в любом случае, существует надежная возможность передать ссылку на rvalue (или временный адрес) другой функции без скучного сохранения ее в переменной просто для этого?

Да, естьесть, как в следующем примере:

#include <iostream>

class MyClass {
       public: MyClass(int a) : a(a) { }
       int a;
   };


void print(MyClass&& a) { std::cout << a.a << std::endl; }

int main() {
    print( MyClass(1337) );
}
2 голосов
/ 23 марта 2012

rvalue не обязательно имеет адрес. Тем не менее, есть способ получить желаемый эффект, используя тот факт, что привязка r-значения к эталону делает его временным (у которого есть адрес):

template<typename T> T *addressOfTemporary(T &&v) { return &v; }

Внутри этой функции v является lvalue (несмотря на то, что объявлено как T&&), поэтому его адрес может быть взят. Вы можете использовать эту функцию следующим образом:

class MyClass {
    public: MyClass(int a) : a(a) { }
    int a;
};

#include <iostream>
void print(MyClass* a) { std::cout << a->a << std::endl; }

int main() {
    print(addressOfTemporary(MyClass(1337)));
    return 0;
}

Обратите внимание, что время жизни временного объекта заканчивается в конце полного выражения (в данном случае выражения print(...)), поэтому вам нужно быть осторожным, чтобы указатель не использовался после этой точки.

1 голос
/ 20 марта 2012

Если вам не требуется печатать значения r * только , вместо этого вы можете использовать стандартную ссылку на констант:

class MyClass {
     public: MyClass(int a) : a(a) { }
     int a; 
};  

#include <iostream> 

void print(const MyClass& a) 
{ std::cout << a.a << std::endl; }  

int main() {
     print(MyClass(1337));
     return 0;
} 
...