Приведение объекта к ссылке? - PullRequest
11 голосов
/ 08 мая 2011

В последнее время я читал некоторый код OSS и наткнулся на этот специфический кусок:

class Foo { ..... };
void bar() {
    Foo x;
   Foo *y=new Foo();
   x=(const Foo &) *y;
}

Насколько я могу судить, я не могу найти документацию о поведении преобразования объекта в константную ссылку.

Ответы [ 4 ]

8 голосов
/ 08 мая 2011

x=(const Foo &) *y; - это назначение . Единственная причина, по которой я вижу явное приведение к константной ссылке, заключается в том, чтобы Foo::operator=(const Foo &) вызывался для присваивания, если Foo::operator=(Foo &) также существует.

6 голосов
/ 08 мая 2011

x=(const Foo &) y; строка вызывает неопределенное поведение.
Предпочитает избегать приведения в стиле C;их легко ошибиться.Вы заставляете компилятор замолчать, чтобы он был слишком опасен.

Редактировать: этот ответ был актуален в то время, когда в вопросе y не было разыменовано перед приведением к const Foo &.Ответ на вопрос после *y редактирования см. В ответе n0rd

3 голосов
/ 08 мая 2011

Интересно, что неправильно прочитанный код все еще возможен, если 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 .
Интересно, что если вы сделаете конструктор явным, он покажет неопределенное поведение, объясненное @ usta.

0 голосов
/ 08 мая 2011

Вы должны будете объявить x после y:

Foo* y = new Foo();
Foo& x = *y;

В качестве альтернативы:

Foo x;
Foo* y = new Foo();
x = (Foo&)*y;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...