Nice programing

생성자를 명시 적으로 삭제하는 이유는 무엇입니까?

nicepro 2020. 10. 10. 10:58
반응형

생성자를 명시 적으로 삭제하는 이유는 무엇입니까?


생성자를 언제 / 왜 명시 적으로 삭제해야합니까? 그 이유가 사용을 막기 위함이라고 가정하면, 왜 그렇게하지 private않습니까?

class Foo
{ 
  public: 
    Foo() = delete; 
};

감사!


어때 :

//deleted constructor
class Foo
{ 
  public: 
    Foo() = delete;     
  public:
    static void foo();
};

void Foo::foo()
{
   Foo f;    //illegal
}

//private constructor
class Foo
{ 
  private: 
    Foo() {}     
  public:
    static void foo();
};

void Foo::foo()
{
   Foo f;    //legal
}

그들은 기본적으로 다른 것들입니다. private클래스의 멤버 만 해당 메서드를 호출하거나 해당 변수 (또는 친구)에 액세스 할 수 있음을 알려줍니다. 이 경우 static해당 클래스 (또는 다른 멤버) 메서드가 클래스의 private생성자 를 호출하는 것은 합법적입니다 . 삭제 된 생성자에는 적용되지 않습니다.

여기에서 샘플을 확인 하세요 .


생성자를 명시 적으로 삭제하는 이유는 무엇입니까?

또 다른 이유 : 이니셜 라이저로 클래스를 호출하고 싶을 때
사용 delete합니다. 런타임 검사없이 이것을 달성하는 매우 우아한 방법이라고 생각합니다.

C ++ 컴파일러가이 검사를 수행합니다.

class Foo
{
   public:
       Foo() = delete;
       Foo(int bar) : m_bar(bar) {};
   private:
       int m_bar;
}

This - very simplified - code assures that there is no instantiation like this: Foo foo;


I've met with default ctors declared as 'deleted' in the source code of LLVM (in AlignOf.h for instance). The associated class templates are usually in a special namespace called 'llvm::detail'. The whole purpose there I think was that they considered that class only as a helper class. They never intended to instantiate them; only to use them within the context of other class templates with some metaprogramming tricks that run in compile time.

Eg. there's this AlignmentCalcImpl class template which is used only within another class template called AlignOf as a parameter for the sizeof(.) operator. That expression can be evaluated in compile time; and there's no need to instantiate the template -> so why not declare the default ctor delete to express this intention.

But it's only my assumption.

참고URL : https://stackoverflow.com/questions/13654927/why-explicitly-delete-the-constructor

반응형