GCC 4.0 vs older code.
От: SkyDance Земля  
Дата: 28.07.05 13:45
Оценка:
Минимальный набор кода, 100% повторяющий проблему:

class Ambiguity
{
public:
    Ambiguity( long& cfg, char* node = NULL ){};
    Ambiguity( long& cfg, int mainID, bool bOptional ){};

private:
    std::auto_ptr<int> m_voc;
};

class AmbFinger
{
public:
    AmbFinger(){};
    void fingering( const Ambiguity& reader ){};
};

class AmbGetter
{
public:
    AmbGetter(){};
    void get(AmbFinger * in )
    {
        char *node;
        long conf;
        in->fingering( Ambiguity( conf, node ) );
    }
};


Этот код отлично компилируется MSVS всех серий. Неплохо оно работало и на старых GCC. И тут черт дёрнул взять и перейти на GCC 4.0.

Так вот, он ругается. Что не может выбрать функцию.
test1.cpp: In member function 'void AmbGetter::get(AmbFinger*)':
test1.cpp:31: error: no matching function for call to 'Ambiguity::Ambiguity(Ambiguity)'
test1.cpp:7: note: candidates are: Ambiguity::Ambiguity(long int&, char*)
test1.cpp:5: note: Ambiguity::Ambiguity(Ambiguity&)

Судя по всему, он хочет видеть конструктор копирования в классе Ambiguity. Сгенерировать его автоматом он не в состоянии из-за auto_ptr<...> (не говорите мне, что auto_ptr не надо так использовать — я знаю, он там просто как пример обламывающего автогенерацию конструктора копирования выражения).

Хочет он его для temporary объекта для передачи в функцию. Но ведь создавать копию объекта ему не надо — объект передается по ссылке, да еще и константный!

Понятно, что можно удовлетворить всех, сделав конструктор копирования. Но интересно, почему же компиляторы ведут себя по разному и что конкретно не устраивает GCC 4.0 ?
Posted via RSDN NNTP Server 1.9
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.