Введите 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 (конструктор копирования вызывается в неинициализированном объекте). Его никогда не следует практиковать.