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(...)
), поэтому вам нужно быть осторожным, чтобы указатель не использовался после этой точки.