Первый прост:
AutoA b_auto_to_a_auto(b_auto); //fails to compile
Это не работает на VC6, поскольку для него требуется шаблоны функций-членов , что стандартная библиотека VC6 не поддерживает. Он компилируется на стандартных совместимых компиляторах.
Обход:
AutoA b_auto_to_a_auto( b_auto.release() );
Второй гораздо более тонкий:)
sink(b_raw_to_b_auto); //fails to compile
Этот не должен компилироваться на совместимом со стандартами компиляторе, потому что происходит неявное преобразование. Компилятор превращает вышеприведенное в
sink( std::auto_ptr<A>( b_raw_to_b_auto ) );
однако, sink
принимает std::auto_ptr<A>
на значение , поэтому временное std::auto_ptr<A>
, созданное неявно компилятором, должно быть copy-constructed в аргумент sink
. Теперь такие временные значения rvalues . R-значения не привязываются к неконстантным ссылкам, но «конструктор копирования» std::auto_ptr
получает аргумент по неконстантной ссылке.
Вот и все - ошибка компиляции. AFAICS это поведение, соответствующее стандартам. C ++ - 0x «семантика перемещения» исправит это, добавив «конструктор копирования», который принимает ссылку на rvalue, хотя я не уверен, сколько любви std::auto_ptr
все еще получит в будущем, что с std::shared_ptr
и всеми.
Обходной путь для второго:
AutoA tmp( b_raw_to_b_auto/*.release() for VC6*/ );
sink( tmp );