В последнее время я читал код OSS и наткнулся на этот своеобразный фрагмент:
class Foo { ..... };
void bar() {
Foo x;
Foo *y=new Foo();
x=(const Foo &) *y;
}
На всю жизнь я не могу найти документацию о поведении приведения объекта к константной ссылке.
Ответ 1 · рейтинг 8 · n0rd
x=(const Foo &) *y; - это назначение. Единственная причина, по которой я вижу явное приведение к константной ссылке, заключается в том, что Foo::operator=(const Foo &) вызывается для присваивания, если Foo::operator=(Foo &) также существует.
Ответ 2 · рейтинг 6 · usta
Строка x=(const Foo &) y; вызывает неопределенное поведение.
Желательно избегать приведения типов в стиле C; их легко ошибиться. Вы заглушаете компилятор, так что они слишком опасны.
Изменить: этот ответ был актуален в то время, когда в вопросе y не было разыменовано до приведения к const Foo &. Ответ на вопрос после редактирования *y см. в ответе, данном n0rd.
Ответ 3 · рейтинг 3 · Xeo
Интересно, что неправильное прочтение кода все еще возможно, если Foo имеет неявный конструктор, который принимает указатель Foo*.
#include <iostream>
class Foo{
public:
Foo() {}
Foo(Foo*) { std::cout << "Aha!\n"; }
};
int main(){
Foo* pf = new Foo;
Foo f = (const Foo&)pf;
std::cin.get();
}
См. выходные данные в Ideone.
Интересно, что если вы сделаете конструктор явным, он покажет неопределенное поведение, объясняемое @уста.
Ответ 4 · Seth Carnegie
Вам нужно объявить x после y:
Foo* y = new Foo();
Foo& x = *y;
В качестве альтернативы:
Foo x;
Foo* y = new Foo();
x = (Foo&)*y;