Введите Type name = name; когда-либо полезный в С++?

В С++ разрешен следующий код:

int a = a;

или

Type name = name;

Оба ведут к инициализации неинициализированного объекта, что часто приводит к поведению undefined.

Является ли такой код когда-либо необходимым или разумным? Имеются ли случаи использования такого кода?

Ответы

Ответ 1

Вам разрешено использовать имя переменной в ее инициализаторе. Код

Type name = name;

вероятно, не полезно, но код

Type name = f(&name);

может быть.

Существует много мест, где синтаксис языка не запрещает бесполезные конструкции.: -)

Ответ 2

Это напомнило мне старый поток списка рассылки GCC, в котором Габриэль Дос Рейс привел следующий пример для создания одного node круговой список:

struct Node {
  Node* link;
  Node(Node& n) : link(&n) { }
};

int main()
{
  Node x = x;
}

Ответ 3

Иногда, если у вас есть сложные инициализаторы, вы можете обратиться к нему. Это используется в конструкторах, где вы передаете указатель или ссылки на this в списке инициализации.

Ответ 4

Это действительно, но само собой разумеется, что

int a = a;

более опасен, чем нет.

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

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

Ответ 5

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

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