Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在新的c++;11个项目,是否默认删除任何操作?_C++_C++11_Delete Keyword - Fatal编程技术网

C++ 在新的c++;11个项目,是否默认删除任何操作?

C++ 在新的c++;11个项目,是否默认删除任何操作?,c++,c++11,delete-keyword,C++,C++11,Delete Keyword,我正在C++11中启动一个新项目,刚刚发现了delete关键字,它可以防止意外调用复制构造函数等等。是否有一组“推荐”的删除操作可以全局执行以提高类型安全性,例如防止表达式中的有符号到无符号强制转换?我应该默认删除所有类中可以删除的所有5个操作吗 FYI,这个程序需要高性能(这就是为什么我多年来第一次使用C++),而且很少有时间我想复制任何东西,所以拷贝通常是一个bug,虽然不是100%的时间,所以我对这个特定的案例感兴趣,以及其他程序的一般情况。我可以潜在地删除复制构造函数,并添加一个单独的

我正在C++11中启动一个新项目,刚刚发现了
delete
关键字,它可以防止意外调用复制构造函数等等。是否有一组“推荐”的删除操作可以全局执行以提高类型安全性,例如防止表达式中的有符号到无符号强制转换?我应该默认删除所有类中可以删除的所有5个操作吗


FYI,这个程序需要高性能(这就是为什么我多年来第一次使用C++),而且很少有时间我想复制任何东西,所以拷贝通常是一个bug,虽然不是100%的时间,所以我对这个特定的案例感兴趣,以及其他程序的一般情况。我可以潜在地

删除
复制构造函数,并添加一个单独的方法,在我确实需要复制的极少时间内复制对象。这是一个好主意吗?

根据我的经验,在某些情况下,删除某些构造函数或操作符是有意义的

例如,考虑<代码> UNQuijpPTR < /Cord>类>当只需要一个指针访问某种类型的数据时(可能在多线程应用程序中),就会使用code>unique\u ptr,因此让多个

unique\u ptr
浮动在所有指针都指向同一对象的位置上是没有意义的

为防止不必要的副本分配,默认情况下,
unique\u ptr
类中包括以下内容:

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

这是从类中删除操作符的一个实例。我会说这是一个非常重要的判断。我的一般规则是问自己,“是否绝对不存在类的客户机应该使用x运算符或y构造函数的场景?”如果您随后决定x或y实际上不应该使用(或者可能很少使用),那么,在我看来,继续删除所述运算符/构造函数可能是有意义的

是的,这个主意似乎不错。使用
delete
声明所有不需要的特殊方法将禁用它们,就像您希望的那样

然而,这在
delete
发明之前也是可能的——在c++11发布之前就已经用于此目的了。即使使用c++11,从
boost::noncopyable
继承似乎比用
=delete
标记所有不需要的特殊成员更容易(键入更少)

此外,由于您提到了“防止有符号转换为无符号转换”——您应该知道内置类型(如
int
无符号转换)之间的转换是内置的,不能禁用。不涉及用户定义类型的转换规则在C和C++中是相同的(只有少数例外),并且不能更改。您最好将编译器配置为“发出所有警告”,并可能“将警告视为错误”

是否有一组“推荐”的删除操作可以全局执行以提高类型安全性,例如防止表达式中的有符号到无符号强制转换

不可以。您当然不能通过删除任何内容来阻止整数转换

我应该默认删除所有类中可以删除的5个操作吗

不!一个被删除的析构函数将使它无法销毁任何东西

此外,删除移动构造函数也是有意义的。如果可以便宜地移动类型,那么即使不希望允许复制,也允许移动(例如,按值返回对象,或按值传递临时值作为函数参数)通常是一件好事。人为地限制该类型的用户在这样做是有效的时候移动它,这只是令人恼火的,并没有提供任何好处

你似乎陷入了一个陷阱,看到一个功能可用,并认为你应该使用它。以下引用似乎与此相关:

关于早期故事的最后一件轶事 其中有人使用了int引用参数。在里面 在讨论这篇论文时,程序员的评论是 -“嗯,这个功能是在语言上的,所以我想我 你应该使用它。我们相信,这不是一个错误 使用C++特征的充分标准。特色 应仅在能够证明 有益的。爬山是“因为它在那里”。 对于C++特性,同样不能成立。他们的 仅仅存在并不是使用的理由

关于你的最后一个问题:

我可能会删除复制构造函数,并添加一个单独的方法,在我确实需要复制对象的极少时间内复制该对象。这是个好主意吗

。。。大概在这种情况下,可以证明删除的副本构造函数是有益的。但我通常会说不,不要这样做,因为这会使对象很难存储在容器中。最好只是仔细编写代码,以避免不需要的副本。如果您没有做到这一点,并且已经证明您确实是在意外复制,那么可以重新考虑删除复制构造函数


但是,您不应该仅仅因为了解了该功能就“默认”删除操作。使用
=default
应该比使用
=delete
更为常见,但对某些非典型行为(如资源的唯一所有权)建模的类除外。

这实际上取决于您的用例。你想禁止复制吗?然后将复制构造函数(和复制赋值运算符)标记为已删除。我个人的意见是,不要在常规的通用基础上做,只在需要的时候做。如果出现性能问题,你确定要复制吗?这种想法通常会导致代码性能下降。你说的“全局”删除是什么意思?我有很多大型对象(数千个对象,每个对象约1MB,因此在我的16GB RAM计算机上,它将使用很大一部分