带有编译时&号检查的指针参数

Pointer arguments with compile-time ampersand checks

本文关键字:检查 指针 参数 编译      更新时间:2023-10-16

我可以让编译器检查我的函数,期望一个指针参数已被调用&someValidVariable而不是NULL,一些变量,或一些文字地址?

我想使用指针参数而不是引用参数,因为在我看来,这些&号使代码更容易理解,但我懒得做非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来创建一个引用会产生未定义的行为,就像使用一个悬空引用来引用一个已经被销毁的对象一样)。所以你真的需要更好地理解什么是引用以及如何正确地使用它们,而不是试图避免使用它们。