Есть ли предупреждение компилятора Visual Studio 2013 для обнаружения ссылок, скопированных вместо назначенных по ссылке - PullRequest
0 голосов
/ 10 мая 2018

В частности, после большого рефакторинга коллега изменил

Foo & foo = DoSomething();

на

auto foo = DoSomething();

, где

Foo & DoSomething();

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

** EDIT **

Все ответы ниже содержат полезные и полезные советы в отношениичто должно или не должно быть сделано.Чтобы было ясно, я искал несколько советов относительно того, что можно сделать после того, как ущерб произошел.Редко используемое предупреждение компиляции было бы неплохо.В конце мы просто просмотрели разницу в коде, чтобы узнать, не была ли одна и та же ошибка повторена.

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

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

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

Может использоваться для ссылок, константных ссылок и возврата по значению.Используя это как значение по умолчанию, auto и auto & четко указывают, что вы хотите скопировать или вы хотите иметь изменяемую ссылку.

Тем не менее, я не знаком с предупреждением компилятора для такого родаконструкции.Я нашел чек-лягушонок, который выглядит примерно так: https://clang.llvm.org/extra/clang-tidy/checks/performance-unnecessary-copy-initialization.html

0 голосов
/ 10 мая 2018

Ваш коллега очень непослушный мальчик. Прежде всего обратите внимание, что Visual C ++ 2013 является , а не компилятором C ++ 11, хотя он реализует некоторые стандарты C ++ 11. Примечательно, что constexpr отсутствует.

Неформально говоря, auto не не автоматически включает &, поэтому они существенно изменились

Foo & foo = DoSomething();

до

Foo foo = DoSomething();

Это воплощает опасность ошибочного рефакторинга без проведения адекватных юнит-тестов.

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

auto&& foo = DoSomething();

Чтобы сгенерировать одноразовый набор предупреждений компилятора, почему бы (временно) не удалить конструктор копирования и не попытаться построить проект?:

Foo(const Foo&) = delete;
0 голосов
/ 10 мая 2018

Хорошим эмпирическим правилом может быть использование decltype(auto) вместо auto и умственная подготовка к этому.

В приведенном примере тип foo будет ссылаться на Foo.

...