gpt4 book ai didi

c++ - 使用移动赋值从算术运算符重载返回 const 值

转载 作者:可可西里 更新时间:2023-11-01 17:58:12 26 4
gpt4 key购买 nike

假设我有以下最小示例类:

#include <iostream>

class Foo {
public:
Foo() = default;

Foo(const Foo&) = default;
Foo(Foo&&) noexcept = default;

Foo& operator=(const Foo& rhs) {
std::cout << "copy\n";

return *this;
}

Foo& operator=(Foo&& rhs) noexcept {
std::cout << "move\n";

return *this;
}

Foo operator+(const Foo& rhs) const {
Foo x; // with some calculation

return x;
}
};

int main() {
Foo a, b, c;

a = b + c;
}

这会按预期打印 move。现在根据 Effective C++ Item 3,我应该从 operator+ 返回 const Foo 以避免像 a + b = c 这样的构造,即:

// To avoid a + b = c
const Foo operator+(const Foo& rhs) const {}

不幸的是,这突然开始调用复制赋值而不是移动赋值运算符。 [我在 Ubuntu 上使用 gcc 4.8.4,但它可能与编译器无关]

如何确保 a + b = c 编译失败,同时为 a = b + c 调用移动赋值?或者随着移动语义的引入,有没有办法同时实现这两者?

最佳答案

正如 Caninonos 在评论中和 max66 在现已删除的答案中指出的那样,我最终使用了左值引用限定符(但 10k 用户可以看到它)。

Foo& operator=(const Foo& rhs) & {}
Foo& operator=(Foo&& rhs) & noexcept {}

它实现起来很简单,而且它提供了更好的界面设计,因为分配给任何其他左值听起来没有意义并且可能是错误的来源。

但是需要注意的是,写错a + b = c的可能性很小。此外,编译器生成的赋值运算符不是左值引用限定的,我们可以用标准类型编写 a + b = c,例如使用 std::string 或使用 std::complex

关于c++ - 使用移动赋值从算术运算符重载返回 const 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48951580/

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