Я читал разницу между прямой инициализацией и инициализацией копирования (§8.5 / 12):
T x(a); //direct-initialization
T y = a; //copy-initialization
Что я понимаю из чтения copy-initialization , так это то, что ему нужен доступный и неявный конструктор копирования , иначе программа не будет компилироваться. Я подтвердил это, написав следующий код:
struct A
{
int i;
A(int i) : i(i) { std::cout << " A(int i)" << std::endl; }
private:
A(const A &a) { std::cout << " A(const A &)" << std::endl; }
};
int main() {
A a = 10; //error - copy-ctor is private!
}
GCC выдает ошибку ( ideone ), говоря:
prog.cpp: 8: ошибка: «A :: A (const A &)» является приватной
Пока все в порядке, подтверждение того, что говорит Херб Саттер ,
Инициализация копирования означает, что объект инициализируется с использованием конструктора копирования , после первого вызова пользовательского преобразования, если это необходимо, и эквивалентен форме "T t = u;":
После этого я сделал copy-ctor доступным, комментируя ключевое слово private
. Теперь, естественно, я ожидал, что будет напечатано следующее:
A (const A &)
Но, к моему удивлению, он печатает это вместо ( ideone ):
A (int i)
Почему?
Хорошо, я понимаю, что сначала создается временный объект типа A
из 10
типа int
с использованием A(int i)
, применяя правило преобразования по мере необходимости здесь (§8.5 / 14 ), а затем предполагалось вызвать copy-ctor для инициализации a
. Но это не так. Зачем?
Если реализация позволяет устранить необходимость вызывать конструктор копирования (§8.5 / 14), то почему она не принимает код, когда конструктор копирования объявлен private
? В конце концов, это не так. Это похоже на избалованного ребенка, который сначала раздраженно просит специфическую игрушку, а когда вы даете ему одну, специфическую игрушку, он выбрасывает ее за спину. : |
Может ли это поведение быть опасным? Я имею в виду, я мог бы сделать что-то еще полезное в copy-ctor, но если оно не вызывает его, то не изменит ли оно поведение программы?