c++ - C++ 中右值引用的分配和不变性

标签 c++

我正在努力掌握 C++ 中的右值。具体来说,我不明白它们的分配位置以及为什么它们需要不可变。假设我有以下代码:

  std::string str = std::string(); 
  const std::string& sref = std::string();

第一行在堆栈中创建一个对象。对象 str 是一个可变对象,我可以用它做任何我想做的事。据我所知,赋值右侧的表达式是右值,而 str 是左值。

第二行在当前函数堆栈中创建了一个对象(我假设)并返回一个指向它的常量引用。这样创建的对象是不可变的。同样,赋值的右侧是右值,但这次我得到了对右值的引用。所有对右值的引用都必须是 const,因为根据 C++ 标准,您不能更改右值的值。第一个问题 sref 在当前函数栈中分配在哪里?为什么它必须是不可变的?我真的不明白为什么如果对象在堆栈中,我不能只修改它。

如果一个对象是不可变的,那么只拥有它的一个实例然后让应用程序中的所有引用都指向它是有意义的。

const std::string& ref_1 = std::string();
const std::string& ref_2 = std::string();

这两个引用在 C++ 中引用同一个对象吗?

最佳答案

它们被分配到哪里并不重要。在您计算机内存中的某处,或者如果它们被优化掉,则可能根本不存在。别担心。

They're not immutable — 如果愿意,您可以修改它们(尝试 std::string().append('!'));只是如果它是对const 的引用,则只允许您将临时绑定(bind)到引用。如果您不将它绑定(bind)到一个引用,您实际上无法在以后命名它以对其执行任何操作。

This limitation was intended to prevent programmer mistakes ,因为修改临时文件通常毫无意义,尽管 Visual Studio 放宽了该限制。然而,you can still make use of this lifetime-extension without const by using an rvalue reference :

std::string&& ref = std::string();
ref.append('!');
std::cout << ref << '\n';

为什么你会这样做?谁知道。

至于你的最后一个问题(请下次每个问题一个问题),不,这两个引用指的是两个不相关的临时 std::string 对象。

关于c++ - C++ 中右值引用的分配和不变性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36268066/

相关文章:

c++ - 返回唯一指针的 STL 容器

c++ - 禁用类功能的模板元编程

c++ - 无法在 uint64 上正确转换我的值?

c++ - 从 WIC 图像 C++ 获取 RGB

c++ - std::string 作为成员函数参数的奇怪行为

c++ - 编写一个 C++ 程序,查找字符串中使用的元音字母的数量

c++ - 结构错误 :"no matching function for call to "

c++ - 如何在一次调用中释放多个互斥量

c++ - 如果同时存在共享库和动态库,则链接器将首选哪个库?

c++ - 如何在 C++ 中创建一个没有路径名的文件夹,只有您要创建的文件夹的名称?