Quando le funzioni del membro speciale (in particolare, copia/sposta i costruttori e gli operatori di assegnazione copia/sposta) di una classe template sono istanziate? Non appena la classe stessa viene istanziata, o solo quando sono necessari?Quando sono state create istanze di membri speciali di una classe template?
Questo avviene nella seguente situazione:
template <class T, class U>
struct pair
{
T first;
U second;
pair() : first(), second() {}
pair(const pair&) = default;
};
struct S
{
S() {}
S(const S&) = delete;
S(S&&) = default;
};
int main()
{
pair<int, S> p;
}
Clang si rifiuta di compilare questo codice, con i seguenti errori:
test.cpp:9:5: error: the parameter for this explicitly-defaulted copy constructor is const, but a member or base requires it to be
non-const
pair(const pair&) = default;
^
test.cpp:21:18: note: in instantiation of template class 'pair<int, S>' requested here
pair<int, S> p;
^
suggerendo che esso tenta di creare un'istanza il costruttore di copia non appena la classe è istanziata.
GCC, tuttavia, compila il codice in modo corretto, suggerendo che proverebbe solo a creare un'istanza del costruttore di copie se fosse effettivamente necessario.
Quale comportamento del compilatore è corretto?
(. Una discrepanza simile è esposto per operatori di assegnazione)
UPDATE: Questo ha qualcosa a che fare con il fatto che il costruttore di copia di pair
in questo esempio è default
Ed, perché se cambio la sua definizione a
pair(const pair& p) : first(p.first), second(p.second) {}
quindi il codice passa clang pure.
Compila bene con clang3.0 con -std = C++ 11. –