Эта функция:
A wow(...)
{ ... }
возвращает объект по значению.
Это означает, что оно копируется обратно в точку, где была вызвана функция.
Эта строка:
stick = wow(...);
Копирует конструкцию на флешку.
Значение, скопированное на карту памяти, является значением, скопированным обратно из функции wow ().
Но помните, что результатом вызова wow () является временный объект (он был скопирован обратно из wow (), но еще не находится в переменной).
Итак, теперь мы смотрим на конструктор копирования для A:
A(A& foo){ ..... }
Вы пытаетесь передать временный объект в ссылочный параметр. Это не разрешено Временный объект может быть связан только с константной ссылкой. Есть два решения проблемы:
1) Используйте константную ссылку.
2) Передать по значению в конструктор копирования.
К сожалению, если вы используете решение (2), вы немного застряли, поскольку оно становится круговой зависимостью. Передача по значению включает использование конструктора копирования, поэтому вы вводите бесконечный цикл. Таким образом, ваше решение - использовать ссылку по константе.