Это не имеет ничего общего с перегрузкой или поиском аргументов. Определив Foo(Foo&)
, вы отключили генерацию конструктора копирования по умолчанию Foo(const Foo&)
, который требуется для инициализации c
из значения r. Добавьте ctor с подписью Foo (const Foo &), и ваш код будет работать нормально. Я не знаю, почему VS10 компилирует это, но я попытаюсь найти пункты, в которых указано, почему это не должно происходить.
Вот и мы:
§12.8 (1) указывает, что не шаблонный конструктор для класса X является конструктором копирования, если его первый параметр имеет тип X &, const X &, volatile X & или const volatile X &, и нет других параметров, или все другие параметры имеют значения по умолчанию.
§12.8 (5) говорит, что если мы не определим конструктор копирования для X (в любой из вышеупомянутых форм), компилятор определит конструктор копирования в форме X (const X &).
Таким образом, определение Foo (Foo &) определяет a конструктор копирования, поэтому компилятор не может неявно определять Foo (const Foo &) больше.