如何在C++中返回Null作为引用
How to return Null as reference in C++?
我做了一些最小代码
vector<int> items = {1, 2, 5, 0, 7};
int& getAtSafe(unsigned n) {
if (n < items.size() && items[n] != 5) return items[n];
else // ???
}
但是,当我们找不到需要的项目时,如何将其返回为null
P.S.原始任务是搜索属性等于.的项目
不接受异常变体。我不需要暂停程序
例如,用户键入索引,每次出错时,用户都会得到"错误输入">
如果函数检查索引,那么在这种情况下的一般方法是抛出异常std::out_of_range.
考虑到在类模板std::vector
中已经存在成员函数at
。
如果您可能不使用异常,并且任务是
p.S.原始任务正在搜索属性等于.的项目
然后您可以使用返回迭代器的标准算法std::find_if
,也可以编写自己的函数来返回与搜索元素相对应的索引。如果没有这样的元素,那么返回向量的大小,例如
#include <iostream>
#include <vector>
template <typename Predicate>
std::vector<int>::size_type find_if( const std::vector<int> &v, Predicate predicate )
{
std::vector<int>::size_type i = 0;
while ( i != v.size() && !predicate( v[i] ) ) ++i;
return i;
}
int main()
{
std::vector<int> items = {1, 2, 5, 0, 7};
auto i = ::find_if( items, []( const auto &item ) { return item % 2 == 0; } );
if ( i != items.size() ) std::cout << items[i] << 'n';
return 0;
}
C++具有值语义。有nullptr
s,但没有空值。引用总是引用一些东西。呃,不能有对null的引用。
你有几个选择:
- 抛出异常。你拒绝它们的理由毫无根据。
std::vector::at
正是这样做的(但我想您的代码只是更一般情况下的一个示例( - 返回一个可以是
nullptr
的指针(不推荐使用,因为这样可以将正确处理它的责任放在调用者身上( - 返回CCD_ 8。这再次迫使调用方处理"未返回值"的情况,但与返回
nullptr
相反,调用方得到了一个设计良好的接口,很难使用错误 - 返回迭代器。
end
通常用于在整个标准库中发出"未找到元素"的信号,因此如果您也这样做,则不会有什么意外 - 也许这不仅仅是一个不同情况的例子,那么您应该使用
std::vector::at
而不是手写功能,并使用它
p.S.原始任务正在搜索属性等于.的项目
您应该使用std::find
在容器中查找项目。当找不到元素时,返回容器的end
。
在不更改原型的情况下,您只能抛出异常。
如果可以选择更改原型,您可以:
- 返回一个指针(并使用
nullptr
作为sentinel( - 返回迭代器(并使用
items.end()
作为sentinel( - 返回一个
std::optional<std::reference_wrapper<int>>
(并使用值的缺失作为sentinel,然后需要C++17或boost(
C++中引用的一个用例是确保没有空指针。因此,根据定义,不可能将null作为引用返回。
然而,可以考虑不同的策略:
- 返回迭代器:使用
std::end(items)
作为空值 - 按值返回
- 如果没有元素有效,则引发异常
相关文章:
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 如何在C++中返回Null作为引用
- 如何引用 obj1 并在 NULL 时调用 show 方法
- 排序时引用绑定到 'value_type' 类型的 null 指针
- 取消引用会导致崩溃,即使对于非 NULL 指针也是如此,原因也是如此
- 如果 null 不是有效值,则使参数成为引用而不是指针
- 我可以根据null或特定类型的值检查引用吗
- 指针引用const null值
- 引用绑定到类型 'struct value_type' 的 null 指针
- 为什么我们需要在move构造函数中将右值引用设置为null
- 检查指针是否为null,然后在同一if语句中取消引用它,这样安全吗
- 如果指针设置为 NULL,则对它的任何引用都不会或通过它也是 NULL
- cppcheck null指针取消引用:m_buffer-否则,针对null进行检查是多余的
- 引用地址如何在C++变为 NULL
- 自定义 std::shared_ptr 或 boost::shared_ptr 以在 NULL 取消引用时引发异常
- IID_PPV_ARGS和取消引用NULL
- 对NULL的引用
- c++函数返回NULL字符串引用
- c++程序在读取NULL引用时崩溃
- 在 Xcode 6.3 下,NULL C++引用地址的计算结果为非零