[英]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.