一个可修改的右值和一个const右值有什么区别?

6
string three() { return "kittens"; }

const string four() { return "are an essential part of a healthy diet"; }

根据这篇文章,第一行是可修改rvalue,而第二行是const rvalue。有人能解释一下这是什么意思吗?

1
显而易见的是,小猫会长大变成猫。 - Yakk - Adam Nevraumont
2
使用第一个函数,例如three()[0] = 'K',而使用第二个函数无法执行此类操作。 - Some programmer dude
名称已经说明了一切。一个是const,另一个不是。 - 463035818_is_not_a_number
@tobi303 是的,但是当这些被调用时,编译器内部发生了什么? - Big Boss
编译器阻止您对const限定(rvalue或其他)引用进行非const操作。这与任何其他const限定类型完全相同,链接的文章也是如此。您真的想知道const在一般情况下的作用吗? - Useless
@Useless,我想要解决的真正问题是:为什么int myFunction(const int& myInput)可以获取任何值,而int myFunction(int& myInput)只能获取可以修改的lvalue?您如何通过const int&“引用”一个rvalue的地址? - Big Boss
2个回答

4

您的函数的返回值是使用std :: string的复制构造函数复制的。如果您使用调试器逐步执行程序,您可以看到这一点。

正如注释所说的那样,它非常易于理解。当您返回第一个值时,它将是可编辑的。第二个值将是只读的。它是一个常量值。

例如:

int main() {


   std::cout << three().insert(0, "All ")  << std::endl; // Output: All kittens.

   std::cout << four().insert(0, "women ") << std::endl; // Output: This does not compile as four() returns a const std::string value. You would expect the output to be "women are an essential part of a healthy diet”. This will work if you remove the const preceding the four function.

}

你确定 four().begin(), four.end() 吗?那不是指向不同的 std::string 的迭代器吗? - Zereges
@Zereges。已修正。 - Santiago Varela

-2
一个rvalue是可以写在赋值运算符的右侧的值。一个可修改的rvalue,从名称中就能看出它的值可以在执行期间随时更改。而const rvalue则是一个常量,在程序执行期间不能被更改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接