Это я уже знаю, его оптимизация, сделанная компилятором.

ал разницу между прямой инициализацией и инициализацией копирования (§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, но если он не вызывает его, то это не меняет поведение программы?

Ответы на вопрос(5)

Ваш ответ на вопрос