Ссылка на ту же переменную, которую вы объявляете - PullRequest
11 голосов
/ 11 октября 2011

Я пару раз видел ошибку следующего типа при работе с кодом C ++:

QString str = str.toUpper();

Это может быть довольно простой ошибкой, но она компилируется и выполняется (иногда с ошибками,иногда без).Я не вижу никаких обстоятельств, при которых это было бы чем-то, что вы на самом деле хотели бы сделать.

Некоторое тестирование показало, что вызывается конструктор копирования, а не конструктор по умолчанию, и что объектсам по себе из конструктора копирования.

Может кто-нибудь объяснить, почему это не ошибка компилятора или даже предупреждение?

Ответы [ 2 ]

7 голосов
/ 11 октября 2011

Технически, объект str определяется при достижении знака равенства, поэтому его можно использовать в этой точке.

Ошибка при попытке инициализировать объект с самим собой, и компилятор разрешенпредупредить об этом (если он способен это обнаружить).Однако, поскольку обнаружение не возможно в каждом случае, компилятор не требуется.

Например, int x = f(x); является полностью правильным, если int f(const int&) не использует значение своего параметра.Как компилятору узнать, что он еще не видел тело функции?

0 голосов
/ 11 октября 2011

Нет ошибок или предупреждений, потому что это эквивалентно:

QString str;
str = str.toUpper();

Так же, как

QString str = "aaa";

так же, как

QString str;
str = "aaa";

Чтобы сделать это втот же оператор, который вам нужен для использования конструктора, который не будет компилироваться:

QString str(str.toUpper());

, например:

QString str("aaa");

не эквивалентен

QString str;
str = "aaa";
...