[英]is there any risk using std::addressof(std::cout) instead of &std::cout?
我正在使用std::cout
进行日志记录,并且 sonarqube 在“不要获取 'cout' 的地址,而是从 lambda 调用它”时报告错误。
std::ostream *streamp;
streamp = &std::cout;
当我使用下面的代码时,在 sonarqube 中没有观察到错误。 在std::cout
function 上使用std::addressof
安全吗?
std::ostream *streamp;
streamp = std::addressof(std::cout);
是的,在std::cout
上使用addressof
是安全的。 但是由于在std::cout
上使用&
同样安全,这样做的唯一原因是让一个明显给你误报的工具安静下来(它没有意识到addressof
正在做什么)。
最好使用&
并使用该工具中存在的任何机制来关闭误报。
std::cout
是 object,而不是 function,因此禁止获取大多数标准函数地址的规则不适用。
std::addressof()
仅在地址运算符可能过载的情况下才需要(通常甚至考虑到一件坏事),因此在模板中使用以避免意外。 任何标准类型都不需要它,因此也不需要对象。
总之,修复工具或忽略该警告,这是您的选择,但不要将您的代码弯曲成椒盐卷饼。
为了扩展标准函数,标准库中的大多数函数都没有被指定为“可寻址”。
因此,获取他们的地址可能会导致意外,从偶然的“工作”,到提供具有意外签名的函数指针(更多 arguments,意外调用约定,等等),到根本无法编译。 这可能会随着工具链的任何变化而改变。
&x
和std::addressof(x)
之间的区别(对于 class 类型的变量)只有在x
具有重载的&
运算符时才会出现。
addressof
是“不,不,我真的想要这个东西的地址,不管 class 设计师有什么规定”。
话虽这么说,99++% 的时间&x
都很好。 对于cout
来说当然没问题,因为您可以查看并看到它没有operator &
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.