为什么字符串文字是左值而不是x值?

问题描述 投票:0回答:1

Ben Saks 在 2019 年奥罗拉(科罗拉多州)CppCon 上的“理解价值类别”课程中(顺便说一句,这是很棒的一课)说:

“字符串文字,例如“examplestring”,是左值,因为它们基本上是数组,需要存储在内存中。”

课程结束时,有人向本问这个问题: “你的意思真的是字符串文字是左值吗?因为,如果它们是,为什么我不能分配给字符串文字?” 他回答“是的,因为它们的行为就像数组,并且需要在内存中占据一个位置”

这让我有点困惑

所以我有一些问题:

  1. 如果字符串文字是左值的唯一原因是,为什么它们不能是临时右值? 在该课程中,他解释说,如果右值太大(例如非常长的整数文字),编译器会将其存储在内存中,但这并不意味着它们是左值......

  2. 为什么我可以将字符串文字作为右值引用传递?

  3. std::string a = "string1"+"string2"; 如果“string1”和“string2”是左值,它们的总和如何可以是右值?

我错过了一些东西,因为总而言之,如果他说字符串文字是 xvalues,那么一切对我来说都是正确的,因为作为数组,它们必须在内存中拥有一个位置,但它们不能是 lvalues,因为它们不是有一个“名称”,但我无法在内存中到达它们,因为我无法知道地址(例如:int a => &a 如果我想到达它)

本课程的 YouTube 链接:https://youtu.be/XS2JddPq7GQ?si=5aCMj1sm4YKHMPW-

提前感谢您的回答。

c++ c literals string-literals rvalue-reference
1个回答
0
投票

字符串文字,例如“examplestring”,是左值,因为它们基本上是数组,并且需要存储在内存中。

字符串文字是

char [N]
类型的数组。所有数组都是不可修改的左值。您可以简单地通过使用它们的名称来获取它们的地址(在大多数情况下它会退化为指针),但您不能在赋值的左侧使用它们:

error: assignment to expression with array type
 "abc" = "def";
       ^

尝试此操作时,您会收到类似的错误:

int arr1[10] = { ... };
int arr2[10] = { ... };
arr2 = arr1;
© www.soinside.com 2019 - 2024. All rights reserved.