簡體   English   中英

具有編譯時&符的指針參數

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM