samedi 29 avril 2017

Default construction of deleted constructor with braced initializer list

Let's say that I want to disable the construction of class, then I can do the following (as per Best style for deleting all constructors (or other function)? ):

// This results in Example being CopyConstructible:
struct Example {
  Example() = delete;
};

or

struct Example {
  template <typename... Ts>
  Example(Ts&&...) = delete;
};

or

struct Example {
  Example(const Example&) = delete;
};

where the first example can still be copied if constructed (which the intention is to disable), but the second two will disable almost all methods for creating Example. If I default construct any of the above using an empty braced initializer list, then the instance is successfully constructed. In Meyer's Effective Modern C++ he gives the example (bottom of page 51):

Widget w3{}; // calls Widget ctor with no args

which I would thus expect to fail for the above Example classes i.e:

Example e{};

should not construct since it should call the deleted default constructor. However, it does, is usable, and if defined as the first case above, is also copyable. See live demo. My question is: Is this correct, and if so, why?

Aucun commentaire:

Enregistrer un commentaire