【发布时间】:2020-03-03 11:46:25
【问题描述】:
我正在尝试编写一个函数,它既可以返回对作为第一个参数传递的现有对象的引用(如果它处于正确状态),也可以使用作为第二个参数传递的字面量创建并返回一个新对象(默认)。
如果一个函数不仅可以接受文字,还可以接受另一个现有对象作为第二个(默认)参数并返回对它的引用,那就更好了。
下面是一个简单的实现,但它做了很多不需要的工作:
如果使用左值作为第二个(默认)参数调用,它会调用一个参数的复制构造函数,该参数被选择返回。理想情况下,应返回对对象的引用。
如果使用文字作为第二个(默认)参数调用,它会调用构造函数、复制构造函数和析构函数,即使没有选择第二个(默认)参数作为返回值。如果在不调用复制构造函数或析构函数的情况下构造并返回对象作为右值引用会更好。
std::string get_or_default(const std::string& st, const std::string& default_st) {
if (st.empty()) return default_st
else return st;
}
有没有一种方法可以更有效地完成此任务,同时又对调用者保持简单?如果我是正确的,这需要一个函数根据函数内部的运行时决策来更改返回类型,但我想不出一个简单的调用者解决方案。
【问题讨论】:
-
如果要返回引用,为什么返回类型不是
const std::string&? -
当然可以吃蛋糕,也可以吃。它只需要更多的工作:将字符串或
std::ref的变体返回到字符串。当然,这有点矫枉过正,但它会完成工作,尽管是以一种相当冗长、略微复杂的方式,需要每个调用者额外的工作才能正确处理结果。 -
@Rualark:这个问题似乎措辞不当。你关心的不是返回值真的;第二个参数
default_st。这就是“构造函数、复制构造函数和析构函数,即使没有选择第二个(默认)参数返回”的整个概念。您想以某种方式获取此参数并根据第一个参数选择是否从中构造std::string。
标签: c++ gcc parameter-passing c++17 return-by-reference