Отключение конструктора по умолчанию для не POD классов - PullRequest
3 голосов
/ 23 ноября 2010

Насколько я понимаю, конструктор копирования по умолчанию в C ++ ведет себя так, как ожидалось, только когда класс является классом POD.

Я хотел бы знать, есть ли решение, препятствующее программисту писать код, которыйили нет) использует конструктор копирования по умолчанию, если объект не является POD.

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

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

А вы, ребята, знаете, может ли cppcheck сделать это?

Ответы [ 4 ]

3 голосов
/ 23 ноября 2010

В C ++ 0x вы можете явно запретить использование специальных функций-членов, таких как:

struct NonCopyable {
    NonCopyable & operator=(const NonCopyable&) = delete;
    NonCopyable(const NonCopyable&) = delete;
    NonCopyable() = default;
};

См. здесь для получения дополнительной информации.К сожалению, все еще ручной, но более элегантный, чем сейчас.

2 голосов
/ 23 ноября 2010

При создании класса у вас есть 3 возможности: иметь копию по умолчанию ctor, написать свой собственный или отключить его (с различными способами сделать это; наследуя от boost :: noncopyable , чтобы упомянуть один).Не совсем понятно, почему компилятор должен предупреждать вас о выборе одного из них.

2 голосов
/ 23 ноября 2010

Централизованный способ отключить конструкцию по умолчанию - сделать конструктор по умолчанию недоступным.

Вы пишете: «Я хотел бы знать, есть ли решение для предотвращения программирования программистом, который (косвенно или нет) использует конструктор копирования по умолчанию, если объект не является POD.» *

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

Извините, не зависит от компилятора.

Причина: очень многие классы, не относящиеся к POD, такие как интеллектуальные указатели и контейнеры, такие как std::vector, полагаются на конструкцию по умолчанию, чтобы быть полезной.

Компилятор g ++ имеет опцию -Weffc++ для предупреждения о нарушениях руководящих принципов в Scott Meyers & rsquo; Эффективный C ++ , но насколько я знаю & ndash; Я могу ошибаться & ndash; это не относится к вашему делу. Однако, как сообщается, может быть полезным.

Приветствия & hth.,

2 голосов
/ 23 ноября 2010

Нет, поскольку это требование языка.

...