gpt4 book ai didi

c++ - 赋值运算符返回值类型

转载 作者:行者123 更新时间:2023-11-30 02:49:22 25 4
gpt4 key购买 nike

我偶然发现赋值运算符返回的不是引用,而是拷贝,作为一种变通方法,可以在 STL 容器中存储具有 const 成员的对象。

class Test_class
{
public:
int const whatever;

explicit Test_class(int w) : whatever(w) {}

// note the missing &
Test_class operator=(Test_class const& rhs) {
return Test_class(rhs.whatever);
}
};

vector<Test_class> vec;
Test_class foo(42);
vec.push_back(foo);
assert(vec[0].whatever == 42);

这段代码感觉很奇怪,但是gcc编译了它似乎能正常工作。

那么陷阱在哪里呢?

编辑:

push_back() vec[0].whatever 之后,实际上是 42。为说明添加了断言。

编辑:

感谢您的回答!只是为了好玩,这个版本也运行得很好;)

void operator=(Test_class const&) {
throw 42;
}

最佳答案

大多数公认的运算符重载实践并未由标准或编译器强制执行。这只是对行为的期望。您可以在这里查看其中的一些内容:Operator overloading或此处:http://en.cppreference.com/w/cpp/language/operators .

这里的陷阱是您的 operator= 并不是真正的赋值运算符。考虑这段代码:

Test_class a(15);
Test_class b(20);
a = b;

通常您会期望 a.whatever 在执行此代码后为 20,但它仍然是 15。

C++03 要求 vector 元素既可复制构造又可复制赋值,编译器可以自由选择使用什么。在 C++11 中,它们只需要是可复制构造的(或可移动构造的),因此不需要赋值运算符。

关于c++ - 赋值运算符返回值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21258723/

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