在哪里使用右值作为函数参数?
Where to use an rvalue as a function parameter?
我知道关于这个论点有很多问题,但我仍然不了解右值的一些基本知识。
假设我有这样一个函数:
/* 1 */ void func( std::string s ) { /* do something with s */ }
我是这样使用的:
int main()
{
func( "a string" );
}
在这种情况下,我将此字符串传递给函数 func
始终以这种方式定义此类函数不会更好:
/* 2 */ void func( std::string&& s ) { /* do something with s */ }
我的问题是:在这种情况下,使用 /* 2 */
而不是 /* 1 */
不是总是更好吗?如果不是,为什么以及在哪里我应该使用其中一个或另一个?事实是,如果我理解得很好,在 /* 2 */
中参数被移动并且永远不会在函数范围之外使用,对吗?
在调用时创建临时字符串的特定示例中,两个表达式是等效的。
事实上,您不能保留两者并使用重载决策,因为它们捕获相同类型的对象(同样,仅在您的示例中)。它们都可以捕获临时字符串并在参数 s
.
中提供它
我知道关于这个论点有很多问题,但我仍然不了解右值的一些基本知识。
假设我有这样一个函数:
/* 1 */ void func( std::string s ) { /* do something with s */ }
我是这样使用的:
int main()
{
func( "a string" );
}
在这种情况下,我将此字符串传递给函数 func
始终以这种方式定义此类函数不会更好:
/* 2 */ void func( std::string&& s ) { /* do something with s */ }
我的问题是:在这种情况下,使用 /* 2 */
而不是 /* 1 */
不是总是更好吗?如果不是,为什么以及在哪里我应该使用其中一个或另一个?事实是,如果我理解得很好,在 /* 2 */
中参数被移动并且永远不会在函数范围之外使用,对吗?
在调用时创建临时字符串的特定示例中,两个表达式是等效的。
事实上,您不能保留两者并使用重载决策,因为它们捕获相同类型的对象(同样,仅在您的示例中)。它们都可以捕获临时字符串并在参数 s
.