gpt4 book ai didi

c++11 - 返回 "this"作为右值

转载 作者:行者123 更新时间:2023-12-03 17:47:54 25 4
gpt4 key购买 nike

正如预期的那样,以下代码不会编译

#include <iostream>

class A
{

public:

A() = default;
~A() = default;

A(const A&) = delete;
A(A&&) = delete;

A& operator=(const A&) = delete;
A& operator=(A&&) = delete;

A& operator<<(const int i)
{
std::cout << "operator<< called" << std::endl;
return *this;
}

};

void foo(A&& a)
{
std::cout << "foo called" << std::endl;
}

int main()
{
A a; a << 14;
foo(std::move(a)); // works fine

foo(A() << 14); // does not compile

return 0;
}

将 A 类更改为
class A
{

public:

A() = default;
~A() = default;

A(const A&) = delete;
A(A&&) = delete;

A& operator=(const A&) = delete;
A& operator=(A&&) = delete;

A& operator<<(const int i) &
{
std::cout << "operator<< called on lvalue" << std::endl;
return *this;
}

A&& operator<<(const int i) &&
{
std::cout << "operator<< called on rvalue" << std::endl;
return std::move(*this);
}


};

使程序编译。但是,使用 std::move 返回右值通常不是一个好主意,因为它会返回悬空引用或阻止编译器进行某些优化。

所描述的情况是“不按右值返回”的经验法则中为数不多的异常(exception)之一,还是应该以不同的方式解决问题?

万分感谢!

最佳答案

此代码完全有效且安全。由于您的对象已经是右值

A&& operator<<(const int i) &&

再次将其转换为右值(移动)不会改变代码的安全性。在这种情况下不会进行 NRVO 优化,因此代码的速度不太可能受到影响。

所以当你制定它时,我会说“是的,这是规则的一个异常(exception)”

此外,这条规则并不普遍:如果您了解正在发生的事情(这就是您问这个问题的原因),您可以依靠自己的判断力而不是它。

关于c++11 - 返回 "this"作为右值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29429148/

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