gpt4 book ai didi

c++ - C++ 中作为右值的常量(11)

转载 作者:可可西里 更新时间:2023-11-01 15:41:27 25 4
gpt4 key购买 nike

为什么 const int 不是 C++(11) 中的 R 值?我认为 R 值是不能在左侧的“任何东西”,常数可以满足这一点。此代码失败:

int f(int && x) { return 100; }

void g() {
const int x = 1;
f(x);
}

error: invalid initialization of reference of type ‘int&&’ from expression
of type ‘const int’

最佳答案

好的,表达式分为三类1:

  1. 代表具有身份且无法移动的对象;
  2. 那些代表具有身份并且可以从中移动的对象;
  3. 那些表示没有标识且可以从中移动的对象;

第一个称为左值,第二个是xvalues,第三个是prvalues。如果我们将 lvalues 和 xvalues 放在一起,我们就有了 glvalues。 Glvalues 是表示具有标识的对象的所有表达式。如果我们将 xvalues 和 prvalues 放在一起,我们就有了右值。右值是表示可以移动的对象的所有表达式。

有问题的表达式,x , 是一个 glvalue:可以写成 &x , 因此该对象显然具有身份。

我们可以离开这个表达式吗?该对象是否即将过期?不它不是。它仅在当前表达式之后的某个时间过期。这意味着它不能被移动。这使它成为左值。

所有这些名称可能有点令人困惑,因为 C++ 中的左值和右值不再表示它们在 C 语言中的含义。 C++ 的含义与位于赋值的左侧或右侧完全无关2

就个人而言,我更喜欢使用 this paper 中的术语作者 Bjarne:iM 值(而不是左值)、im 值(而不是 x 值)、Im 值(而不是纯右值)、i 值(而不是左值)和 m 值(而不是右值)。不幸的是,这不是标准使用的术语。


1 这里的“have an identity”是指“它的地址可以被拿走”; "can be moved from"意味着它即将过期,要么是由于它的临时性质,要么是因为程序员通过调用 std::move 在类型系统中明确表明了这一点。或类似的东西。

2 您可以在赋值的左侧设置右值:std::vector<int>(17) = std::vector<int>(42)是一个有效的表达式,即使它是无用的。

关于c++ - C++ 中作为右值的常量(11),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13724553/

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