есть ли риск использования std :: addressof (std :: cout) вместо & std :: cout? - PullRequest
1 голос
/ 29 мая 2020
• 1000 код ошибки в sonarqube не наблюдается. Безопасно ли использование std::addressof в функции std::cout?
std::ostream *streamp;
streamp = std::addressof(std::cout);

Ответы [ 3 ]

3 голосов
/ 29 мая 2020

Да, использование addressof на std::cout безопасно. Но поскольку использование & на std::cout в равной степени безопасно, единственная причина для этого - заглушить инструмент, который явно дает вам ложное срабатывание (что он не понимает, что делает addressof). .

Было бы лучше использовать & и задействовать любые механизмы, существующие в инструменте для отключения ложных срабатываний.

2 голосов
/ 29 мая 2020

std::cout - это объект, а не функция, поэтому правила, запрещающие получение адреса большинства стандартных функций, не применяются.

std::addressof() требуется только там, где оператор адреса может быть перегружен (как правило, это плохая вещь, которую даже следует учитывать), и поэтому используется в шаблонах, чтобы избежать сюрпризов. В нем нет необходимости ни для каких стандартных типов, а значит, и для объектов. 1008 *

Чтобы расширить стандартные функции, большинство функций в стандартной библиотеке не обозначены как «адресуемые».
Таким образом, выбор их адреса может привести к неожиданностям, от «случайной работы» до предоставления указатель на функцию с неожиданной сигнатурой (больше аргументов, неожиданное соглашение о вызовах, что угодно), чтобы вообще не компилироваться. И это может измениться с любым изменением в цепочке инструментов.

0 голосов
/ 29 мая 2020

Разница между &x и std::addressof(x) (для переменных типа класса) возникает только в том случае, если x имеет перегруженный оператор &.

addressof означает «нет, нет, Мне действительно нужен адрес этой штуки, независимо от того, что постановил дизайнер классов ".

При этом 99 ++% случаев &x в порядке. Это определенно нормально для cout, так как вы можете посмотреть и увидеть, что у него нет operator &.

...