带有编译时&号检查的指针参数
Pointer arguments with compile-time ampersand checks
我可以让编译器检查我的函数,期望一个指针参数已被调用&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
来创建一个引用会产生未定义的行为,就像使用一个悬空引用来引用一个已经被销毁的对象一样)。所以你真的需要更好地理解什么是引用以及如何正确地使用它们,而不是试图避免使用它们。
- 如何强制检查指针值
- 检查指针是否指向矢量元素
- 如何创建一个带锁的指针数组并检查指针是否空闲?
- 如何检查指针后面的对象是否有效或已删除?
- 如何检查指针是否在C 中删除
- 检查指针是否是带有变异模板的派生的指针
- C++ - 检查指针数组中的指针是否已"filled"
- 检查指针到向量C 内的对象
- 如何检查指针是否指向正确对齐的内存位置
- (C++) 检查指针数组中的空值
- 使用 new 并能够检查指针是否为 0(空)
- 如何检查指针指向的地址是否0x0?
- 检查指针是否为null,然后在同一if语句中取消引用它,这样安全吗
- 如何检查指针数组中的 c++ 对象指针是否已设置
- C++:另一个"检查指针是否为空"
- 如何在分配更多内存空间之前检查指针是否为 NULL
- x86-64上检查指针范围是否跨越N字节对齐地址的最快方法
- 检查指针句柄是否有效
- 如何在没有带布尔的包装的情况下检查指针是否有效
- C++ - 检查指针是否指向有效内存(此处不能使用 NULL 检查)