Dre*_*rew 4 c++ c++11 delete-keyword
我正在C++ 11中开始一个新项目,并且发现了delete关键字,它可以防止意外调用复制构造函数等等.我是否可以在全局范围内执行"推荐"的删除操作以提高类型安全性,例如防止在表达式中签名为无符号转换?我应该默认在delete我delete的所有班级中完成所有5项操作吗?
仅供参考,这个程序需要高性能(这就是我多年来第一次使用C++的原因)并且很少有我想要复制的东西,所以副本通常是一个bug,尽管不是100%的时间所以我对这个具体案例感兴趣,以及其他程序的一般情况.我可能会delete复制构造函数并添加一个单独的方法来复制对象,这是我需要复制的罕见时间.这是个好主意吗?
我是否可以在全局范围内执行"推荐"的删除操作以提高类型安全性,例如防止在表达式中签名为无符号转换?
不可以.你当然不能通过删除任何东西来阻止整数转换.
我应该默认删除我可以删除的所有5个操作吗?
没有!删除的析构函数将无法破坏任何东西!
此外,删除移动构造函数很少有意义.如果您的类型可以便宜地移动,那么允许移动(例如,当按值返回对象,或者通过值作为函数参数传递临时值)通常是一件好事,即使您不想允许复制.在这样做时人为地限制该类型的用户移动它是有效的只是令人讨厌并且不提供任何优点.
您似乎陷入了看到某个功能可用并且认为您应该使用它的陷阱.以下来自The Old Man和C的引用似乎相关:
关于早期故事的最后一则轶事,其中某人使用了int参考参数.在讨论这篇论文时,程序员的评论是 - "嗯,这个特性是在语言中,所以我认为我应该使用它." 我们认为这不是使用C++特性的充分标准.只有在可以证明有益的情况下才应使用该功能.一座山被攀登"因为它在那里".C++功能也不应该这样.它们的存在不仅仅是使用的理由.
至于你的最后一个问题:
我可能会删除复制构造函数并添加一个单独的方法来复制该对象,这是我需要复制的罕见时间.这是个好主意吗?
...... 也许 ......这可能是一个可以证明删除的拷贝构造函数有益的情况.但我会说一般不,不要这样做,因为它使得很难将对象存储在容器中,例如.最好只是仔细编写代码以避免不需要的副本.如果您没有这样做并且证明您确实在制作意外副本,可能会重新考虑删除复制构造函数.
但是,您不应该仅仅因为您已经了解该功能而"默认"删除操作.这应该是很多常见的做法= default,而不是= delete除了类,模型的一些非典型的行为,如资源的唯一所有权.
根据我的经验,在某些情况下删除某些构造函数或运算符是有意义的.
例如,考虑unique_ptr班级.unique_ptr当只需要一个指针来访问某种数据时(可能是在多线程应用程序中),就会使用它,因此让多个unique_ptr浮点数全部指向同一个对象是没有意义的.
为防止不需要的副本分配,默认情况下会在unique_ptr类中包含以下内容:
unique_ptr& operator= (const unique_ptr&) = delete;
Run Code Online (Sandbox Code Playgroud)
这是从类中删除运算符有意义的一个例子.我会说这是一个很好的判断.我的一般规则是问自己,"是否绝对没有类的客户端应该使用x运算符或y构造函数的情况?" 如果你确定x或y实际上从未(或者可能很少)使用,那么,在我看来,继续删除所述运算符/构造函数可能是有意义的.
| 归档时间: |
|
| 查看次数: |
237 次 |
| 最近记录: |