Когда я скомпилирую следующий код с помощью g++
class A {};
void foo(A&) {}
int main()
{
foo(A());
return 0;
}
Появляются следующие сообщения об ошибках:
> g++ test.cpp -o test
test.cpp: In function ‘int main()’:
test.cpp:10: error: invalid initialization of non-const reference of type ‘A&’ from a temporary of type ‘A’
test.cpp:6: error: in passing argument 1 of ‘void foo(A&)’
После некоторого размышления эти ошибки имеют для меня большой смысл. A()
- это просто временное значение, а не назначаемое место в стеке, поэтому у него не будет адреса. Если у него нет адреса, я не могу ссылаться на него. Хорошо, отлично.
Но подождите! Если я добавлю следующий оператор преобразования в класс A
class A
{
public:
operator A&() { return *this; }
};
тогда все хорошо! Мой вопрос заключается в том, что это даже отдаленно безопасно. Что именно указывает this
, когда A()
создается как временное значение?
Мне внушают уверенность в том, что
void foo(const A&) {}
может принимать временные значения в соответствии с g++
и всеми другими компиляторами, которые я использовал. Ключевое слово const
всегда может быть отброшено, поэтому меня удивило бы, если бы существовали какие-либо фактические семантические различия между параметром const A&
и параметром A&
. Поэтому я предполагаю, что другой способ задать свой вопрос: почему ссылка const
на временное значение считается безопасным компилятором, тогда как ссылка не const
не является?