我有以下几种形式的方法
foo(std::string const & name)
if (name.empty()) {...}
我试图遵循Scott Meyers关于使用通用引用的注释和std :: forward来创建一个有效地采用多种字符串形式的函数。
从示例中,我了解如何使用std :: forward将函数参数转发给另一个函数,但是如何处理name.empty()表达式?
我认为答案是std :: forward(name).empty()但是我可以找到任何实际上都是这样的文档。
答案 0 :(得分:3)
仅在您确实需要转发值类别时才使用std::forward
。也就是说,std::forward
用于保证如果使用lvalue参数调用函数,则它将使用lvalue参数调用另一个函数,如果使用rvalue参数调用函数,则它将调用另一个函数一个右值论证。
如果要检查字符串是否为空,则参数是左值还是右值并不重要 - string::empty
函数的行为不应该不同。所以你不需要std::forward
。相反,只需name.empty()
即可。
答案 1 :(得分:2)
有一种简单的方法可以确定何时使用std::forward
。
想象一下,您传入的参数不是T&& t
只是T t
- 值参数而不是转发引用。如果您在第二种情况下致电std::move(t)
,则在第一种情况下调用std::forward<T>(t)
是个好主意。
std::forward
是有条件的举动。它将调用move
如果引用是传入的右值,并且如果它不是右值则几乎不会执行任何操作。
接下来的问题是,您何时应该move
一个值参数?
嗯,第一个一般规则是你应该在你上一次在其范围内引用它时移动一个值参数。您将其状态标记为&#34; scratch&#34;并且它会在最后一次操作中被回收。
还有一些其他地方可以使用move
。
如果要将其分解为单个组件(如元组的各个部分),并且您知道访问权限将与部件(std::get<N>
或.member
)隔离,并且没有违反的不变量,然后move
会告诉代码组件可以从对象中被撕掉。在这种意义上,你最终可以多次在同一个变量上调用move
,但每次你在概念上只移动它的一部分。
这有时与在组件本身上调用move
不同,因为std::get<i>(std::move(foo))
在std::move( std::get<i>(foo) )
包含引用参数时的行为与foo
不同。