gpt4 book ai didi

c++ - 查找指向 NULL 的指针

转载 作者:行者123 更新时间:2023-11-30 00:46:03 25 4
gpt4 key购买 nike

我有int* foo[SIZE]我想在其中搜索指向 NULL 的第一个元素.

但是当我这样做的时候:

 std::find(foo, foo + SIZE, NULL)

我得到错误:

error C2446: '==' : no conversion from 'const int' to 'int *'

我应该只使用 static_cast<int*>(NULL) 吗?而不是 NULL

C++11 通过 nullptr 解决了这个问题但在 C++03 中这不是我的选择

最佳答案

tl;dr:使用 nullptr,或定义您自己的等价物。


问题是 NULL 是一些扩展为值为零的整型常量表达式的宏。为了调用函数,std::find 必须推断类型并使用值 (0)。

您不能将 int*int 进行比较,因此会出现错误。就函数而言,您只是向它传递了一些恰好为零的常规旧 int,这些不能转换为空指针;它们必须是整数常量表达式。

通常 NULL “有效”,因为它在不被视为整数形式的上下文中使用,例如:

if (ptr == NULL)

因为在这里它保持了它的“整数常量表达式”状态,所以转换为被比较类型的空指针。

如果你使用的是 C++11 或更高版本,你应该使用 nullptr,因为这实际上是一个空指针,而不是一个转换成它的整数。您所描述的实际上是引入 nullptr 的激励因素之一。

nullptr 有多种 C++03 实现,如果您需要的话。我在这个答案的底部附上了经典的实现。

此外,如果可能,您应该更喜欢 std::array(如果需要,Boost 有一个),或者至少使用 std::beginstd::end 获取数组的开始和结束指针(同样,有这个 float 的实现):

#include <algorithm>
#include <array>

int main() {
std::array<int*, 8> foo = {};
std::find(foo.begin(), foo.end(), nullptr);
}

总而言之,在紧要关头强制转换为您的类型的空指针是一个有效的解决方案。 nullptr 实际上只是“转换为所需类型的空指针的事物”的缩写。


这是一个 nullptr 实现,最初由 Scott Meyers 创建:

const
struct nullptr_t {
template <typename T>
operator T*() const {
return 0;
}

template <typename C, typename T>
operator T C::*() const {
return 0;
}

private:
void operator&() const;

} nullptr = {};

语法看起来有点滑稽,因为我们通常不会同时定义类和变量。显然,如果您想保持 C++11 兼容,nullptr 不是可用的标识符。 null_ptrnullpointer 是不错的选择。

关于c++ - 查找指向 NULL 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40031426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com