2016-03-22 10 views
11

Quindi, la mia domanda è semplice:Un costruttore/assegnamento predefinito è infastidito da noexcept o constexpr?

C'è qualche punto nello specificare un costruttore della classe in default come noexcept o constexpr (o qualsiasi altra cosa si potrebbe cosa)?

struct foo 
{ 
    foo() = default; 
    // vs 
    constexpr foo() noexcept = default; 

    // same thing would apply for copy/move ctors and assignment operators 
}; 

I due si comportano allo stesso modo?

Dipende se la classe è POD? Ad esempio con l'esempio precedente entrambi si comporterebbero allo stesso modo, mentre se ad esempio avessi un membro privato std::vector<int> v = { 1, 2, 3, 4 }; che utilizza l'assegnazione in classe, foo() = default; per impostazione predefinita non sarà noexcept e non constexpr.

Scrivendo foo() = default; il compilatore sceglie la migliore versione: noexcept se possibile e constexpr se possibile, ecc.?

Spero che la domanda sia chiara!

risposta

13

[dcl.fct.def.default]/2-3:

2 Una funzione esplicitamente-default non definito come cancellato può essere dichiarato constexpr solo se sarebbe stato implicitamente dichiarata come constexpr. Se una funzione è esplicitamente default sul proprio prima dichiarazione ,

  • è implicitamente considerata constexpr se la dichiarazione implicita sarebbe, e,
  • ha le stesse specifiche eccezioni, come se fosse stata implicitamente dichiarata ([except.spec]).

3 Se una funzione che viene esplicitamente in default è dichiarata in un specifica delle eccezioni che non è compatibile ([except.spec]) con la specifica eccezione della dichiarazione implicita, quindi

  • se la funzione è esplicitamente impostata per difetto nella sua prima dichiarazione, è definita come cancellata;

  • in caso contrario, il programma è mal formato.

In altre parole, foo() = default;, che è necessariamente la prima dichiarazione del costruttore di default foo s', sarà "constexpr se possibile" e "noexcept se possibile". È ancora utile scrivere esplicitamente constexpr e noexcept; significa "gridami se non può essere constexpr/noexcept".

Problemi correlati