Подтвердить что ты не робот

Ссылка на ту же переменную, которую вы объявляете

Я несколько раз видел ошибку типа при работе с кодом С++:

QString str = str.toUpper();

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Нет ошибки или предупреждения, поскольку ее эквивалент:

QString str;
str = str.toUpper();

Как и

QString str = "aaa";

совпадает с

QString str;
str = "aaa";

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

QString str(str.toUpper());

как:

QString str("aaa");

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

QString str;
str = "aaa";