Это я уже знаю, его оптимизация, сделанная компилятором.
ал разницу между прямой инициализацией и инициализацией копирования (§8.5 / 12):
T x(a); //direct-initialization
T y = a; //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;":
После этого я сделал копию 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, но если он не вызывает его, то это не меняет поведение программы?