Есть ли способ заставить компилятор (здесь, в частности, MSVC 2017, но могут быть интересны и другие) выдавать предупреждение в тех местах, где используются конструктор копирования определенного класса и оператор присваивания копии (и таким образом, чтобы его можно было явно подавить на каждом сайте вызова, даже если он непрямой)?
Этот вопрос касается создания ошибок компиляции, что теперь легко сделать с удаленными методами С++ 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>
и, похоже, не подвержены подавлению (или отключению) предупреждений в этой строке кода.
Есть ли способ решить это или какой-то другой способ сделать то, что я хочу?
protected:
илиprivate:
. - person Eljay   schedule 11.01.2019