std :: string x (x); - PullRequest
       39

std :: string x (x);

9 голосов
/ 27 марта 2010
std::string x(x);

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

Ответы [ 3 ]

9 голосов
/ 27 марта 2010

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

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

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

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

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

string x = string(x);
6 голосов
/ 27 марта 2010

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

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

2 голосов
/ 27 марта 2010

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

...