C++ 11替代boost :: checked_delete

ric*_*eek 5 c++ std language-lawyer c++11

作为前瞻性声明的重要使用者,我喜欢我的课程在破坏时完成.为了确保这一点,我将析构函数设为私有并成为朋友boost::checked_delete:

#include <boost/checked_delete.hpp>

struct MyClass
{
  //MyClass's interface
  private:
  ~MyClass() { /* something */ }
  friend void boost::checked_delete<>(MyClass* x);
};
Run Code Online (Sandbox Code Playgroud)

在C++ 11中,std::default_delete还会检查销毁时的完整性.然而,我无法实现与上述相同的行为:

#include <memory>

struct MyClass
{
  //MyClass's interface
  private:
  ~MyClass() { /* something */ }
  friend struct std::default_delete<MyClass>;
};

int main()
{
  //const std::shared_ptr<MyClass> d { 
  //  std::make_shared<MyClass>() 
  //}; //(1) Should compile?

  const std::shared_ptr<MyClass> d(
    new MyClass,std::default_delete<MyClass>()
  ); //(2) Does compile
}
Run Code Online (Sandbox Code Playgroud)

我想知道

  1. 如何将标记为(1)的行编译?使用std::make_shared是一件好事
  2. 标记为(2)的行是否真的有效?明确指定删除器感觉很糟糕

我正在使用GCC 4.8.0,我检查了-std = c ++ 11和-std = c ++ 1y标志.

Som*_*ude 0

不要将make_shared调用放入初始化列表中,只需进行正常的初始化:

const std::shared_ptr<MyClass> d = std::make_shared<MyClass>();
Run Code Online (Sandbox Code Playgroud)

至于第二件事,如果您不指定删除程序,那么它将是默认删除程序。