gpt4 book ai didi

c++ - 如何禁止分配给临时对象和从其他类型隐式转换?

转载 作者:行者123 更新时间:2023-11-30 02:42:45 26 4
gpt4 key购买 nike

我为普通对象和临时对象重载了两次 = 运算符。不幸的是 g++ (Debian 4.7.2-5) 4.7.2 允许太多的临时对象。例如,他不应该允许分配给临时对象。他还允许将其他类型变量分配给对象。

#include <cstdlib>
#include <utility>
#include <iostream>
using namespace std;
class Simple {
int number;
public:
int getNumber() const {
return number;
}
Simple(const Simple& that) : number(that.number) {}
Simple(Simple&& that) : number(move(that.getNumber())) {}
Simple(int a) {number = a;}
Simple& operator=(const Simple &base) {
if (&base != this) {
this->number = std::move(base.getNumber());
}
return *this;
}
Simple& operator=(Simple&& base) {
if (&base != this) {
this->number = std::move(base.getNumber());
}
return *this;
}
};
Simple reverse(const Simple& base) {
Simple result(base.getNumber());
return result;
}
int main(int argc, char** argv) {
Simple one(4);
Simple two(5);
one = two.getNumber();//This should be compile error.
reverse(two) = one;This should be compile error.
return 0;
}

如何更改此代码以禁止分配给临时对象以及来自其他类型的隐式转换?

附加信息:我怎样才能使这条指令可实现:

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

我尝试在运算符声明的末尾添加 && = delete,但编译器引发了编译错误。我尝试在类范围之外实现此运算符,但没有效果。

最佳答案

第一个问题是您是否真的想维护代码以抑制这些情况。通常,对于类类型,允许将临时(右值)赋值,因为它正在调用任何其他成员函数。在 C++11 及更高版本的右值引用中,您可以在重载决策期间区分右值和左值,这可用于阻止对右值的赋值。要阻止 int 的赋值,您可以禁止所有隐式转换(我建议无论如何都不要进行隐式转换)或阻止特定的赋值运算符:

class Simple { 
// ...
// Disallow implicit conversions from int
explicit Simple(int);

// Inhibit assignment to rvalues
Simple& operator=(Simple const &) && = delete;

// Alternatively, require that it is called on an lvalue
Simple& operator=(Simple const &s) &;
Simple& operator=(Simple &&) &;

// ... or block assigment from 'int'
Simple& operator=(int) = delete;
};

尽管老实说,我只会禁止隐式转换,而将其余的留给类的用户。

关于c++ - 如何禁止分配给临时对象和从其他类型隐式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26809789/

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