Это неверное утверждение относительно представленного вами кода, потому что оператор >> имеет дело с копией исходного объекта, используемого в качестве аргумента оператора.
Оператор должен быть объявлен как
istream& operator>>(istream& is, A &a) {
is >> a.first >> a.last;
return is;
}
Более того, конструктор копирования не копирует элементы данных.
Таким образом, программа имеет неопределенное поведение. Например, запустив его с помощью clang HEAD 11.0.0, вы можете получить следующий результат
prog.cc:8:9: warning: unused parameter 'a' [-Wunused-parameter]
A(A&a) { cout << "c ctor \n"; }
^
1 warning generated.
enter first and last:
c ctor
c ctor
first:4202496 last:0
То есть программа выводит переменные первыми и последними с неопределенными значениями, поскольку члены-данные созданного объекта b
в оператор << не был инициализирован. </p>