gpt4 book ai didi

c++ - 将从函数返回的右值分配给另一个右值

转载 作者:可可西里 更新时间:2023-11-01 18:29:13 24 4
gpt4 key购买 nike

class Test {

public:

int n1;

};

Test func() {

return Test();

}

int main() {

func() = Test();

}

这对我来说没有意义。如何以及为什么允许这样做?它是未定义的行为吗?如果一个函数返回一个右值,那么如何将一个右值设置为另一个右值呢?如果我用任何原始类型尝试这样做,它会像我预期的那样给我一个错误。

我知道左值是内存中的一个位置,那么函数是否创建一个临时左值(右值?)并将其分配给另一个左值?谁能解释一下这种语法是如何工作的?

最佳答案

函数调用表达式的值类别实际上是一个右值。

事实上,您不能在右值基元上调用复制赋值运算符。 C 中右值的历史定义实际上是它们不能位于赋值左侧的区别。

不过,类的赋值运算符有点不同。它们是常规成员函数。并且没有规则阻止调用右值的成员函数。事实上,当函数有副作用时,它通常非常有用。

它是如何工作的,复制赋值运算符在临时对象上被调用,运算符复制右边的参数,改变临时对象的状态。语句之后,临时对象被丢弃。没有UB,只是无意义的复制。

可以通过使用引用限定符声明运算符来防止对右值调用复制赋值:Test& operator=(Test) & = default;。引用限定符只是在 c++11 的后期添加的,因此(隐式)复制赋值不能更早地指定为引用限定符。据推测,C++11 没有更改隐式复制构造函数的限定符以防止破坏确实分配给右值的旧代码,即使这样的分配看起来毫无意义。 High Integrity C++ Coding Standard建议您将 ref 限定符与用户定义的复制赋值运算符一起使用。

关于c++ - 将从函数返回的右值分配给另一个右值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35378090/

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