Supponiamo di avere la seguente classe:Perché non è possibile istanziare una coppia con un costruttore di copie "non const" mentre è possibile creare un'istanza senza?
struct A {
A() {}
A (A &) = delete;
};
int main() {
std::pair<A, int> p1;
return 0;
}
Il seguente codice non riuscirà a compilare (usando -std=c++11
con g++
) con il seguente errore:
/usr/include/c++/5/bits/stl_pair.h: In instantiation of ‘struct std::pair’:
test.cpp:13:23: required from here
/usr/include/c++/5/bits/stl_pair.h:127:17: error: ‘constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = A; _T2 = int]’ declared to take const reference, but implicit declaration would take non-const
constexpr pair(const pair&) = default;
Secondo il messaggio di errore, vorrei assumere questo perché non è possibile instanciare il costruttore di copie predefinito a causa del qualificatore const
sull'argomento std::pair
.
Potrei capire perché questo non si compilerebbe senza lo = delete
, perché non è possibile installare il costruttore di copie che prende un parametro std::pair const&
.
Ma con il = delete
, mi aspetto che il compilatore non istanzia un tale costruttore perché non può (per quanto ho capito). In realtà, questo costruttore di copia viene eliminato come dimostrato da questo pezzo di codice:
std::pair<A, int> p1;
decltype(p1) p2(p1);
che non riesce:
test.cpp:11:23: error: use of deleted function ‘constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = A; _T2 = int]’
decltype(p1) p2(p1);
In sostanza, la mia domanda è: Perché il compilatore non riesce a un'istanza di un costruttore di copia eliminata di std::pair
?
Vedere http://cplusplus.github.io/LWG/lwg-closed.html#2068 –