我在下方有一个功能,可以搜索my_type
的向量。目前,它有一个编译警告:control reaches end of non-void function [-Wreturn-type]
。看来,只要我使用引用作为我的返回类型而不是指针,就不可能返回类似null的值?
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;
}
}
答案 0 :(得分:3)
看来只要我使用引用作为返回类型而不是指针,就不可能返回类似null的值?
嗯,是的,但这不是唯一的问题。引用永远不会是null
,但如果您的if
语句永远不会评估为true
,会发生什么?您不会返回任何内容。
由于引用不能为null,因此返回null
无效。您必须从所有执行路径返回有效的引用。
此外,您的代码充其量也是脆弱的。您将返回对容器中元素成员的引用...可能在将来的任何时间点移动的元素,使该引用无效。
答案 1 :(得分:1)
你必须考虑的问题是,当你的函数必须返回my_type
时,如果找不到“无”,你应该返回什么。如何处理这直接影响调用者如何使用此函数和假设。
您可以考虑一些想法。例如,如果您的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 */ }