我想创建一个函数,它接受一个可选的对象引用,并在函数执行期间为其创建一个对象(如果未提供该对象)。
void Foo(Bar& b = Bar()) { /* stuff */ }
当然,这是无效的代码,因为在此上下文中,Bar
不能隐式转换为 Bar
引用。引用不能是 const
,因为函数内部对 b
进行了更改。
您可以通过使用右值引用来解决这个问题,即:
void Foo(Bar&& b = Bar()) { /* stuff */ }
这是否是正确使用右值引用的方式?现在调用者必须在它们的 Bar
参数上调用 std::move
,即使我没有清除传递的 Bar
的意图,而通常当你传递右值时会这样做。
void Foo(Bar & b = stay(Bar()))
? 其中使用了template <typename T> T & stay(T && t) { return t; }
。 - Kerrek SB&&
的模板函数。这很反直觉,因为它们与在其签名中也使用&&
的rvalue引用参数没有任何关系。 - Mooing Duck