簡體   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