[英]Pointer arguments with compile-time ampersand checks
我可以讓編譯器檢查我的期望使用指針參數的函數是否已通過&someValidVariable
而不是NULL
,某些變量或某些文字地址進行了調用嗎?
我想在參考參數上使用指針參數,因為這些&符使IMO代碼更易於理解,但我懶於進行非NULL檢查。
我能兼得兩全嗎?
對於nullptr
您可以添加一個重載,該重載以虛擬std::nullptr_t
作為參數。
但是除此之外,這實際上是不可能的,除了可以執行的數組之外,例如
template<std::size_t N>
void your_function(int (&array)[N]) { ... }
而不是讓它衰減到指針。
在C ++ 11中,您可以聲明接受std::nullptr_t
的函數的重載,而不定義該函數。 這通常會導致鏈接器錯誤(與編譯器錯誤不同)。 (盡管這不會阻止調用程序執行諸如your_function((YourVariable *)nullptr)
-它將使用NULL指針調用函數)。
除此之外(在任何C ++版本中)都是不可能的,除了一些特殊情況,例如將引用傳遞給數組(此類函數不會傳遞NULL
或(在C ++ 11中)傳遞nullptr
)。 原因是指針的基本屬性是按值傳遞指針,並且編譯器允許類型(或允許的類型轉換)有效。 傳遞值后,唯一的檢查方法是在函數運行時。 唯一的例外是傳遞未初始化指針的值,該指針本身會導致未定義的行為(因此,任何事情都可能發生,並且所有賭注都無效)。
但是,實際上,解決您的問題的真正方法是傳遞引用。 目的之一是保證它們引用實際對象(對NULL
進行引用以創建引用會產生未定義的行為,就像使用對已破壞對象的懸掛引用一樣)。 因此,您確實需要努力更好地了解什么是引用以及如何正確使用它們,而不是避免使用它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.