如何从非空函数返回
How to return from a non-void function?
下面有一个函数,它搜索向量my_type
。目前,它有一个编译警告:control reaches end of non-void function [-Wreturn-type]
。看来,只要我使用引用作为我的返回类型,而不是指针,它是不可能返回一个空值?
struct my_type{
type_a a;
type_b b;
}
type_b& value(type_a& t){
typename std::vector<my_type>::iterator it;
for(it = v.begin(); it != v.end(); ++it){
if ((*it).a == t) return (*it).b;
}
}
看来,只要我使用引用作为我的返回类型,而不是指针,它是不可能返回一个空值?
嗯,是的,但这不是唯一的问题。引用永远不能是null
,但是如果您的if
语句永远不会求值为true
,会发生什么?你不返回任何。
由于引用不能为空,所以返回null
是无效的。你必须从所有的执行路径返回一个有效的引用。
同样,你的代码是脆弱的。您正在返回对容器中元素成员的引用…
您必须考虑的问题是,当您的函数必须返回my_type
时,如果发现'nothing',您应该返回什么。如何处理直接影响调用者如何使用该函数和所做的假设。
你可以考虑一些想法。例如,如果您的value
函数返回一个指针类型,您可以只返回NULL
来表示什么都不表示。如果它返回一个字符串,您可以使用空字符串""
,甚至是一个特殊的字符串值,如"none"
来表示它。对于type_b
,您可以创建它的一个特殊实例,然后返回该实例,不表示任何内容。调用此函数的其他函数将根据该实例检查返回的type_b
,看看它是否为空。关键是,有很多方法可以做这件事,你选择哪一种取决于你。
但是更好的方法是使用stl已经提供的东西——特别是std::find_if
。例如,您可以创建一个函子来指定何时有匹配:
struct find_b
{
const type_a &this_a;
find_b(const type_a &a) : this_a(a) {}
bool operator() (const my_type &lhs)
{
return lhs.a == this_a;
}
};
那么你可以这样使用:
item = std::find_if(v.begin(), v.end(), find_b(t));
if(item == v.end()) { /* not found */ }
else { /* found, do something useful here */ }
相关文章:
- 从函数返回const char*数组
- 检查函数返回类型是否与STL容器类型值相同
- 从 c 或 cpp 系列子函数返回到主函数
- 从函数返回任意简单类型的数据
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 从 C++ 中的函数返回数组地址问题
- VirtDisk.h QueryChangesVirtualDisk() 函数返回 RangeCount 为 0
- 为什么glGetSubroutineIndex为不同的函数返回相同的值?
- 在 c++ 中将函数返回类型指定为模板参数
- 从封装在对象中的函数 C++ 返回时为空的列表
- 为什么向量内部的指针在从函数返回时会发生变化?
- 函数返回的 rvalue 引用(表达式)是 xvalue - 但没有标识?
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- 寿命延长从函数返回引用
- 程序不向函数返回值
- 字符串函数返回奇怪的值
- 类的大问题,以及从空函数c++返回
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- C++二叉搜索树模板从函数返回节点
- NVCC 错误:string_view.h:constexpr 函数返回是非常量