static_pointer_cast駐留在std命名空間中。然而,它需要也在std命名空間中的指標。
因此,std::合格的呼叫和不合格的呼叫都被接受。
哪一個是正確的,更慣用的稱呼方式static_pointer_cast?
uj5u.com熱心網友回復:
通常,如果您確切知道要呼叫哪個函式,而不是允許自定義,我會盡量避免 ADL,這意味著避免不合格的呼叫。
在這種情況下,不希望庫為自己型別static_pointer_cast的shared_ptrs 提供自己的。你總是想呼叫std版本。直接呼叫std::static_pointer_cast保證沒有其他類似的static_pointer_cast干擾。
例如,如果您包含一個庫,該庫還宣告了某個名為的函式,static_pointer_cast該函式恰好對您的呼叫可行,并且比該函式更適合或更專業地解決多載問題std,如果您使用不合格的呼叫,您可能會不小心呼叫它。
我認為這在 的情況下極不可能成為問題static_pointer_cast,因為庫不太可能以多載對正常std::static_pointer_cast呼叫可行并且同時更好匹配的方式使用該名稱,所有沒有意識到其中的含義。
但是例如,std::launder當引入 C 17 時,這似乎發生在某些代碼庫中(反之亦然),并且在std使用標準庫型別的非限定呼叫中,多載結果比庫更匹配爭論。
如果您查看例如 C 標準庫實作,您會發現它們遵循此規則以非常嚴格地避免不合格的呼叫,并且僅在標準期望用戶能夠自定義呼叫的地方使用它們。當然,對于非庫代碼,尤其是這可能不是一個重要的考慮因素。
但還要注意,在 C 20 之前,如果沒有static_pointer_cast通過通常的非限定查找找到命名的函式模板,那么使用顯式模板引數串列(對于 是必需的static_pointer_cast)的非限定呼叫無論如何都會失敗。因此,在 C 20 之前,您實際上無法選擇在沒有事先using宣告的情況下使用非限定呼叫來匯入函式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/493784.html
上一篇:Raylib我的螢屏碰撞不準確
