gpt4 book ai didi

c++ - 右值引用和左值引用作为参数的区别

转载 作者:行者123 更新时间:2023-12-04 18:04:21 28 4
gpt4 key购买 nike

看完帖子:http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html .
当您编写将左值或右值引用作为参数的函数时,我无法弄清楚,例如:

void printReference (const string& str)
{
cout << str;
}

void printReference (string&& str)
{
cout << str;
}
为什么 第一个 printReference 函数可以接受任何参数,无论是左值还是右值,也不管左值或右值是否可变。
然而,在 第二 printReference 函数,只允许传递可变右值。
可能是我的理解是错误的,谁能帮我弄清楚。

最佳答案

只有常量左值引用可以绑定(bind)到临时对象。
所以这个函数

void printReference (const string& str)
{
cout << str;
}
可以为以下对象调用:
const std::string s1( "constant lvalue" );
printReference( s1 );

std::string s2( "non-constant lvalue" );
printReference( s2 );

printReference( "A temporary object of type std::string" );

printReference( static_cast<const std::string>( "A temporary object of type std::string" ) );
至于这个功能
void printReference (string&& str)
{
cout << str;
}
在上述对象中,您只能将其称为非常量右值。
printReference( "A temporary object of type std::string" );
你可能不会这样称呼它
printReference( static_cast<const std::string>( "A temporary object of type std::string" ) );
由于 const 限定符的存在。
如果您将通过以下方式重载函数
void printReference (const string&& str)
^^^^^
{
cout << str;
}
然后这个电话
printReference( static_cast<const std::string>( "A temporary object of type std::string" ) );

将是有效的。

关于c++ - 右值引用和左值引用作为参数的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33829606/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com