2010-03-27 3 views
8
std::string x(x); 

Это очень плохо сбой в моем компиляторе. Означает ли это, что я должен проверить на this != &that в моих собственных конструкторах копий, или я могу предположить, что ни один клиент никогда не будет настолько глуп?std :: string x (x);

+0

Вы имеете в виду результирующую программу сбой, или сам компилятор сработает? –

+0

В конструкторе копирования, который не нужен, но вы должны проверить это в операторе присваивания. –

+1

Результирующая программа вылетает во время выполнения. – fredoverflow

ответ

6

Инициализация чего-либо с собой - это неопределенное поведение, которое, возможно, даже может означать, что после его вызова вы даже не сможете его обнаружить позже. Предположим, что компилятор обнаруживает это, и из-за злости создается сборка для носовых демонов, а не для вызова конструктора копирования вообще?

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

+1

Где именно стандарт говорит, что это неопределенное поведение? – fredoverflow

+1

Честно говоря, я удивлен, что он даже компилируется. Проблема заключается в том, что конструктор копирования std :: string' пытается попытаться вызвать методы/данные доступа в 'x', но' x' еще не сконструирован. Поэтому это неопределенное поведение, потому что оно будет пытаться делать вещи с переменной, которая еще не построена. –

+0

@FredOverflow: Я думаю, что одна часть стандарта, которая имеет значение, является «точкой объявления» (3.3.1). Также возможно, что это имеет некоторые значимые применения, например, предположим, что класс хранит ссылку на другой экземпляр класса (или самого себя), тогда мы могли бы сделать, например: «X x (« self », x); X y («other», x); »и т. Д. В этом случае, я полагаю, правила были бы похожи на использование ** this ** в списке инициализации класса. – UncleBens

9

Вам не следует проверять код, который пытается сбой плохо. См. Null References. В нем говорится:

«Как вы должны предположить, что указатель не нуль действителен, вы должны предположить, что ссылка действительна. Вы должны верить в своих коллег-программистов».

Я хочу дополнить

... вы должны предположить, что источник копии действителен.

Если вы «исправите» ваш случай, что делать для этого?

string x = string(x); 
2

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

Смежные вопросы