繁体   English   中英

使用 std::addressof(std::cout) 代替 &std::cout 有什么风险吗?

[英]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,意外调用约定,等等),到根本无法编译。 这可能会随着工具链的任何变化而改变。

&xstd::addressof(x)之间的区别(对于 class 类型的变量)只有在x具有重载的&运算符时才会出现。

addressof是“不,不,我真的想要这个东西的地址,不管 class 设计师有什么规定”。

话虽这么说,99++% 的时间&x都很好。 对于cout来说当然没问题,因为您可以查看并看到它没有operator &

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM