2014-12-28 7 views
5

La seguente definizione non è consentito dalla mia compilatore come std::string ha un distruttore non banale (ha senso che teststr non possono avere un dtor banale quando un membro non lo fa):La classe letterale con std :: string funziona solo con la specializzazione del modello?

class teststr 
{ 
private: 
    std::string _m; 
public: 
    constexpr teststr(std::string value) : _m(value) {}; 

    constexpr std::string m() const { return _m; } 
    void m(std::string value) { _m = value; } 
}; 

Tuttavia, il seguente equivalente (al meglio delle mie conoscenze) definizione di teststr è consentito:

template<typename T> 
class test 
{ 
private: 
    T _m; 
public: 
    constexpr test(T value) : _m(value) {}; 

    constexpr T m() const { return _m; } 
    void m(T value) { _m = value; } 
}; 

typedef test<std::string> teststr; 

cosa si tratta templating tipo che rende questa definizione ha permesso?

+0

magari fornendo quale compilatore si sta utilizzando? – Creris

+0

g ++ (rev5, progetto Costruito da MinGW-W64) 4.8.1 – Matt

+1

Cosa succede quando si crea un'istanza di typedef? –

risposta

5

constexpr è più spesso consentito nei modelli poiché non è generalmente noto al momento della definizione del modello se il membro soddisfa i requisiti di constexpr. Quando un membro del modello viene dichiarato constexpr, viene determinato al momento dell'istanza del modello se constexpr è appropriato e, in caso contrario, viene rilasciato automaticamente.

Dato

template <typename T> struct test { 
    T val; 
    constexpr test(T val) : val(val) { } 
}; 

si può avere

constexpr test<int> i = 3; 

perché con T = int, il costruttore risponde alle esigenze di constexpr, ma non si può avere

constexpr test<string> s = ""; 

perché che costruttore d o non soddisfano i requisiti di constexpr.

Non è un errore grave creare un'istanza test<string> perché ciò limiterebbe notevolmente la possibilità di utilizzare constexpr nei modelli.

Dalla standard (C++ 11):

7.1.5 L'identificatore constexpr [dcl.constexpr]

6 Se il modello di specializzazione un'istanza di un modello constexpr funzione o membro la funzione di un modello di classe non riuscirebbe a soddisfare i requisiti per una funzione constexpr o un costruttore constexpr, tale specializzazione non è una funzione constexpr o un costruttore constexpr. [...]

Problemi correlati