使用std :: addressof(std :: cout)而不是&std :: cout有什么风险吗?

时间:2020-05-28 21:46:50

标签: c++ c++11 sonarqube c++14

我正在使用std::cout进行日志记录,并且当“不要使用'cout'的地址,而是从lambda调用它的地址”时,sonarqube报告错误。

std::ostream *streamp;
streamp = &std::cout;

当我使用下面的代码时,声纳波中没有观察到错误。在std::addressof函数上使用std::cout是否安全?

std::ostream *streamp;
streamp = std::addressof(std::cout);

3 个答案:

答案 0 :(得分:3)

是的,在addressof上使用std::cout是安全的。但是,由于在&上使用std::cout是同样安全的,因此这样做的唯一原因是使一个显然给您假阳性的工具安静下来(它并没有意识到{{ 1}}在做)。

最好使用addressof并使用该工具中存在的任何机制来关闭误报率。

答案 1 :(得分:2)

std::cout是一个对象,而不是一个函数,因此禁止采用大多数标准函数的地址的规则不适用。

std::addressof()仅在地址运算符可能会过载的情况下才需要(通常甚至是一件不好的事情),因此在模板中使用它可以避免意外情况。任何标准类型都不需要它,因此对象也不需要。

最后,请修复该工具或忽略该警告(您可以选择),但不要将您的代码弄成椒盐脆饼。


要扩展标准功能,标准库中的大多数功能都未指定为“可寻址”。
因此,使用它们的地址可能会导致意外,从偶然性的“工作”,到给函数指针提供意外的签名(更多的参数,意外的调用约定等),甚至根本无法编译。而且可能会随着工具链的改变而改变。

答案 2 :(得分:0)

&xstd::addressof(x)之间的区别(对于类类型的变量)仅在x具有重载的&运算符的情况下出现。

addressof的意思是“不,不,我真的想要这个东西的地址,无论班级设计者决定采取什么措施。”

话虽如此,&x的99%以上的时间是可以的。对于cout来说当然很好,因为您可以看到它没有operator &