xvalues:非类类型和类类型之间的差异

天顶

考虑下面的最小示例:

#include<utility>

struct S { };

int main() {
    S s;
    std::move(s) = S{};
}

它编译没有错误。
如果我改用非类类型,则会出现错误。
例如,以下代码无法编译:

#include<utility>

int main() {
    int i;
    std::move(i) = 42;
}

枚举,作用域枚举等也一样。
错误(来自GCC)是:

使用xvalue(右值引用)作为左值

这背后的原理是什么?

我想这是正确的,但是我想了解使用非类型类的所有类型执行此操作的原因是什么。

天顶

我正在尝试通过一系列指向标准的链接来回答我自己的问题。
我非常确定我会写出非常错误的内容,并且有人会来跟我打招呼。
好吧,我尽力解释了如何从标准中推导出问题中所描述的内容。
如果需要,可以随意投票,但是请让我知道出了什么问题,以便能够解决问题并理解错误。
谢谢你。


3.9 / 8(类型):

一个 对象类型 是一个(可能CV修饰)类型不函数类型,不是引用类型,而不是 CV空隙。

5.2.2 / 10(表达式,函数调用):

如果结果类型是对对象类型的右值引用,则函数调用为x值

因此,在两种情况下std::move都是xvalue表达式。

5.18 / 3(任务):

如果左操作数不是类类型,则将表达式隐式转换为左操作数的cv不合格类型。

这不会添加有用的信息,但这是为了完整性。

4.1 / 2(左值到右值转换):

否则,如果T具有类类型,则转换从glvalue复制初始化T类型的临时对象,并且转换结果是该临时对象的prvalue。

否则,glvalue指示的对象中包含的值就是prvalue结果。

其余的由12.2(临时对象)完成。

因此,正如@xaxxon在评论中提到的那样,我实际上是在尝试做(让我写)42 = 0;,它在C ++中不是有效的表达式。

正如@bogdan的注释中正确指出的,在这种情况下要参考的标准的正确部分是5.18 / 1(赋值):

全部都需要可修改的左值作为其左操作数[...]

尽管5/25/3阐明了该语句仅适用于内置运算符。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Clojure中类型和类之间的差异

来自分类Dev

Haskell和ML之间的类型系统差异

来自分类Dev

上界类型和正常类行为的差异

来自分类常见问题

类型和类型别名之间的Elm差异?

来自分类Dev

插座类型之间的差异

来自分类Dev

演员类型之间的差异

来自分类Dev

插座类型之间的差异

来自分类Dev

统一类型和非类型模板参数

来自分类Dev

非类型模板参数和要求

来自分类Dev

构造函数,模板和非类型参数

来自分类Dev

Scala:类型类和ADT之间的区别?

来自分类Dev

具有类型/非类型参数的相同模板类?

来自分类Dev

在Haskell中将非类型类函数与类型相关联

来自分类Dev

类“类型”和特定类型之间有什么关系?

来自分类Dev

Rails html.erb文件类型,<%%>和<%=%>之间的差异

来自分类Dev

等效Java和Kotlin Stream代码之间的意外类型差异

来自分类Dev

类型参数中*(星号)和_(下划线)之间的差异

来自分类Dev

PostgreSQL 9.0和9.1之间的枚举类型文字的顺序差异

来自分类Dev

单例设计模式和不同类型之间的差异?

来自分类Dev

TypeScript:函数类型之间的差异

来自分类Dev

在将指针作为非类型模板参数传递给数据成员时,推断类型和类

来自分类Dev

引用类型和已使用的模板非类型参数

来自分类Dev

通用超类和超类类型之间的区别

来自分类Dev

(类型)和类型之间的区别

来自分类Dev

模板非类型参数?

来自分类Dev

非类型变量约束

来自分类Dev

类从非类型的对象继承意味着什么?

来自分类Dev

子类中的类模板非类型成员访问

来自分类Dev

基于非类型参数的存在的类模板重载?