假设我有一个函数,它接收指针。
int functionA(int* a, int* b)
{
...
}我可以在functionA中添加空检查。是否有一种方法可以确保在nullptr作为参数传递时编译时发生错误。
发布于 2022-01-23 10:36:17
是一种方法,我可以确保当nullptr作为参数传递时,编译时就会发生错误。
如果您具体指的是nullptr关键字,那么就算是吧。您可以提供在这种情况下将选择的重载,并将其定义为“删除”。这是工作的,只要你没有显式绕过超载,例如,铸造。
int functionA(int*, std::nullptr_t) = delete;
int functionA(std::nullptr_t, int*) = delete;
// ...
functionA(&i, &j) // OK
functionA(nullptr, &i); // error
functionA(&i, nullptr); // error
functionA(nullptr, nullptr); // error或
NULL
除了以前的重载之外,这还需要为整数添加重载:
int functionA(int*, int) = delete;
int functionA(int, int*) = delete;
// ...
functionA(NULL, &i); // error
functionA(&i, NULL); // error
functionA(NULL, NULL); // error如果您指的是任何带空值的指针,那么就不能这样做,因为函数参数的值通常不能在编译时被知道。
如果您的目标是不使用指针作为迭代器,那么将更安全、更方便地传递引用。
发布于 2022-01-23 12:18:36
这里要做的正确的事情是使用引用。
int functionA(int& a, int& b);关于引用的心理模型是:这些指针不应该表示nullptr。
发布于 2022-01-23 11:45:13
经过一小时的谷歌搜索,我终于找到了一种方法来实现这一目标。如果您真的想做编译时检查,这就是实现它的方法。
#include <iostream>
#include <cstdlib>
template<typename T, T* N>
static void ValidatePtr() {
std::static_assert(N != nullptr);
}
int main() {
constexpr int* ptr = nullptr;
ValidatePtr<int, ptr>();
std::cout << "Test" << std::endl;
}快速运行:如果需要验证函数的编译时指针,则必须确保它们是常量表达式。该方法实际上需要一个常量表达式才能编译。这将确保所传递的唯一指针必须在编译时确定。您不能使用&variable引用其他变量的地址,因为它会引发编译器错误,因此必须像constexpr int* ptr = nullptr;或constexpr int* ptr = (int*)0xFFFFFFFF那样专门键入。
但是,如果希望检查动态变量,则需要在运行时进行检查,因为如果不使用constexpr来确定地址,就无法进行检查。
在内存实用程序之外,我看不出这是什么用途。
我强烈建议对nullptr进行运行时检查,如果您认为有必要,可以使用普通的assert调用而不是static_assert,或者使用throw引发异常。
https://stackoverflow.com/questions/70820698
复制相似问题