我正在使用std::cout
进行日志记录,并且当“不要使用'cout'的地址,而是从lambda调用它的地址”时,sonarqube报告错误。
std::ostream *streamp;
streamp = &std::cout;
当我使用下面的代码时,声纳波中没有观察到错误。在std::addressof
函数上使用std::cout
是否安全?
std::ostream *streamp;
streamp = std::addressof(std::cout);
答案 0 :(得分:3)
是的,在addressof
上使用std::cout
是安全的。但是,由于在&
上使用std::cout
是同样安全的,因此这样做的唯一原因是使一个显然给您假阳性的工具安静下来(它并没有意识到{{ 1}}在做)。
最好使用addressof
并使用该工具中存在的任何机制来关闭误报率。
答案 1 :(得分:2)
std::cout
是一个对象,而不是一个函数,因此禁止采用大多数标准函数的地址的规则不适用。
std::addressof()
仅在地址运算符可能会过载的情况下才需要(通常甚至是一件不好的事情),因此在模板中使用它可以避免意外情况。任何标准类型都不需要它,因此对象也不需要。
最后,请修复该工具或忽略该警告(您可以选择),但不要将您的代码弄成椒盐脆饼。
要扩展标准功能,标准库中的大多数功能都未指定为“可寻址”。
因此,使用它们的地址可能会导致意外,从偶然性的“工作”,到给函数指针提供意外的签名(更多的参数,意外的调用约定等),甚至根本无法编译。而且可能会随着工具链的改变而改变。
答案 2 :(得分:0)
&x
和std::addressof(x)
之间的区别(对于类类型的变量)仅在x
具有重载的&
运算符的情况下出现。
addressof
的意思是“不,不,我真的想要这个东西的地址,无论班级设计者决定采取什么措施。”
话虽如此,&x
的99%以上的时间是可以的。对于cout
来说当然很好,因为您可以看到它没有operator &
。