Есть ли способ заставить компилятор (в частности, MSVC 2017 здесь, но и другие могут быть интересны) выдавать предупреждение в местах, где используется конструктор копирования конкретного класса и оператор копирования-назначения используется (и таким способом, который может быть явно подавлен на каждом сайте вызовов, даже если он косвенный)?
Этот вопрос задает вопрос о возникновении ошибок компиляции, что теперь легко с удаленными методами C ++ 11, но я хочу, чтобы код все еще компилировался, просто выводя предупреждения.
Причина в том, что у меня есть класс, который в настоящее время много копируется по всей базе кода. Я не хочу предотвращать его копирование (некоторые из них необходимы), но я хочу просмотреть каждое местоположение, чтобы определить, следует ли его заменить на перемещение или передачу по ссылке.
Позволить компилятору временно пометить использование конструктора в качестве предупреждения, казалось отличным способом сделать это.
Я пытался добавить что-то вроде этого:
__declspec(deprecated) MyType(MyType const&) = default;
Но это не работает; по-видимому, = default
выигрывает у всех других модификаторов.
Я сделал то же самое, но полностью реализовал метод вместо этого, и этот почти работает - он генерирует C4996 на каждом сайте вызова, и я могу просмотреть их и либо изменить, либо добавить:
#pragma warning(suppress:4996)
если я счастлив, что это обязательная копия. (В конце концов я планирую удалить их вместе с устаревшей версией конструктора - это просто служебная работа, чтобы отследить, с какими я еще не работал.)
К сожалению, есть некоторые случаи, которые я не могу подавить таким образом, например:
std::vector<MyType> list;
list.push_back(type);
list.emplace_back(MyType{ type });
Каждая из этих строк выдает предупреждения (первое, потому что это объявление поля внутри класса с обычным конструктором копирования), но только третья здесь может быть напрямую подавлена. Первые два выдают предупреждения внутри <vector>
и, похоже, не подвержены подавлению (или отключению) предупреждений в этой строке кода.
Есть какой-то способ решить это или другой способ сделать то, что я хочу?