Как отличить rvalue от lvalue?
У меня есть некоторый класс A. Мне необходимо сделать функцию func(A a), которая принимает в качестве аргумента lvalue от класса А, но не принимает rvalue от класса A. В случае попытки использовать rvalue класса A - компилятор должен указать на ошибку. Вот пример программы, которая на мой взгляд не должна работать, но компилятор не указывает никакой ошибки. Каким образом - в результате какого правила или какой логики rvalue превращается в lvalue и наделяется адресом? Если это делает какой-то конструктор копирования, можно ли его переопределить? Я пробовал запускать эту программу на Visual Studio 2012, 2019 с опциями Treat Specific Warnings As Error 4238;4239, а также на gcc, но они даже не сообщают о том, что при вызове func, rvalue превращается в lvalue.
class A
{ const int value;
public:
A(const int from_any_type) :value(from_any_type)
{
}
};
const A A_rvalue(const A from_any_type)
{ const A a = from_any_type;
return a; //return as rvalue
}
void func(const A& from_lvalue)
{ //here we get lvalue
const A* real_address = &from_lvalue;
}
int main()
{
func(A_rvalue(3));
return 0;
}