Załóżmy, że masz następujące klasy:Dlaczego nie można utworzyć pary z konstruktorem kopii "non const", skoro można go utworzyć bez niego?
struct A {
A() {}
A (A &) = delete;
};
int main() {
std::pair<A, int> p1;
return 0;
}
Poniższy kod nie powiedzie się skompilować (używając -std=c++11
z g++
) z powodu następującego błędu:
/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;
Zgodnie z komunikatem o błędzie, Przypuszczam dzieje się tak dlatego, że nie można zainicjować domyślnego konstruktora kopiowania ze względu na kwalifikator const
dla argumentu std::pair
.
Mogłem zrozumieć, dlaczego nie skompilowałoby się bez = delete
, ponieważ nie można zainicjować konstruktora kopiowania, który ma parametr std::pair const&
.
Ale z = delete
, oczekiwałbym, że kompilator nie będzie tworzył takiego konstruktora, ponieważ nie może (o ile rozumiem). Właściwie, to konstruktor kopia zostanie usunięta, jak pokazano przez ten kawałek kodu:
std::pair<A, int> p1;
decltype(p1) p2(p1);
która nie:
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);
zasadzie moje pytanie brzmi: Dlaczego kompilator nie instancję usuniętą konstruktora kopii std::pair
?
Zobacz http://cplusplus.github.io/LWG/lwg-closed.html#2068 –