В выражении:
A a(foo(A(10)));
Результатом подвыражения A(10)
является rvalue типа A
. (5.2.3 [expr.type.conv])
При инициализации константной ссылки из rvalue компилятор может создать временное значение из rvalue и связать его со ссылкой. Даже если он решит не делать этого, конструктор копирования должен быть доступен. (8.5.3 [decl.init.ref]) Этого не произошло бы, если бы ссылка была инициализирована из , совместимого со ссылкой lvalue , где прямое связывание является обязательным. *
Поскольку foo
принимает свой параметр по ссылке, а не по значению, для самой инициализации аргумента не требуется копия.
foo
возвращает целое число, поэтому здесь нет копии A
.
a
инициализируется напрямую из int, возвращаемого foo, поэтому здесь нет копии A
.