почему это не возможно, чтобы создать пару с “не сопи” конструктор копирования, а можно создать его без?


Предположим, у вас есть следующий класс:

struct A {    A () {}    A (A &) = delete;};int main() {    std::pair<A, int> p1;    return 0;}
-std=c++11g++

Следующий код не будет компилироваться (через с ) со следующей ошибкой:

/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;

conststd::pair

Согласно сообщению об ошибке, я предполагаю, что это потому, что это не возможно, чтобы instanciate конструктор копии по умолчанию, потому что делается на спор.

= deletestd::pair const&

Я мог понять, почему это не будет компилироваться без , потому что это не возможно, чтобы instanciate конструктор копирования, который принимает параметр.

= delete

Но , я бы ожидал, что компилятору не инстанцировать такой конструктор, потому что он не может (насколько я понимаю). На самом деле, этот конструктор копирования удаляется, как показано на этот кусок кода:

std::pair<A, int> p1;decltype(p1) p2(p1);

Который терпит неудачу:

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);

std::pair

В принципе, мой вопрос: почему компилятор не удается создать удаленный конструктор копирования ?