相关疑难解决方法(0)

移动语义==自定义交换功能已过时?

最近,许多 问题 弹出如何提供自己的swap功能.使用C++ 11,std::swap将使用std::move和移动语义以尽可能快地交换给定值.当然,这仅适用于提供移动构造函数和移动赋值运算符(或使用按值传递的运算符)的情况.

现在,有了这个,是否真的有必要swap在C++ 11中编写自己的函数?我只能想到不可移动的类型,但是再一次,自定义swaps通常通过某种"指针交换"(也就是移动)来工作.也许有某些参考变量?嗯...

c++ swap obsolete move-semantics c++11

31
推荐指数
1
解决办法
5452
查看次数

删除 nullptr 可能会也可能不会调用释放函数。为什么不保证后者呢?

C++20 标准说(参见[expr.delete]

如果删除表达式的操作数的值为空指针值,则未指定是否将如上所述调用释放函数。

cppreference.com 说(请参阅删除表达式

如果表达式计算结果为空指针值,则不会调用析构函数,并且可能会或可能不会调用释放函数(未指定),但保证默认释放函数在传递空指针时不执行任何操作。

如果删除表达式的操作数为 null,为什么编译器会调用释放函数?

如果可以保证不会调用释放函数,则规则会更简单,但我认为标准允许这样做是有充分理由的。


提案:我认为delete ptr;应该指定为与此等效:

if (ptr) {
   // call dtor.
   // call deallocation function
}
Run Code Online (Sandbox Code Playgroud)

如果ptr已知为空或不为空,我们就会进行相应的优化。释放函数会假设它们的参数不为空,因此不会!= nullptr发生双重检查。

我认为这个更简单。

c++ compiler-optimization language-lawyer delete-operator

3
推荐指数
1
解决办法
181
查看次数