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
Re: GCC 4.0 vs older code.
От: aton Россия http://ruby.inuse.ru
Дата: 28.07.05 13:51
Оценка:
Здравствуйте, SkyDance, Вы писали:

SD>Понятно, что можно удовлетворить всех, сделав конструктор копирования. Но интересно, почему же компиляторы ведут себя по разному и что конкретно не устраивает GCC 4.0 ?


как известно gcc 4.0 очень нестабилен, попробую одновиться до 4.0.1
Re[2]: GCC 4.0 vs older code.
От: MaximE Великобритания  
Дата: 28.07.05 14:00
Оценка:
aton wrote:

> Здравствуйте, SkyDance, Вы писали:

>
> SD>Понятно, что можно удовлетворить всех, сделав конструктор копирования. Но интересно, почему же компиляторы ведут себя по разному и что конкретно не устраивает GCC 4.0 ?
>
> как известно gcc 4.0 очень нестабилен, попробую одновиться до 4.0.1

Приведи ссылку на "как известно". Дистрибутив Fedora Core 4 весь скомпилирован gcc 4.0.0, а тестинг у FC4 нехилый был.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re: GCC 4.0 vs older code.
От: MaximE Великобритания  
Дата: 28.07.05 14:06
Оценка:
SkyDance wrote:

[]

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


Он его генерит, и выглядит он так Ambiguity(Ambiguity &), т.е. его нельзя вызвать с r-value.

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

>
> Понятно, что можно удовлетворить всех, сделав конструктор копирования. Но интересно, почему же компиляторы ведут себя по разному и что конкретно не устраивает GCC 4.0 ?

Вывод Comeau говорит все человеческим языком.

Thank you for testing your code with Comeau C/C++!
Tell others about http://www.comeaucomputing.com/tryitout !

Your Comeau C/C++ test results are as follows:

Comeau C/C++ 4.3.3 (Aug  6 2003 15:13:37) for ONLINE_EVALUATION_BETA1
Copyright 1988-2003 Comeau Computing.  All rights reserved.
MODE:strict errors C++

"ComeauTest.c", line 47: warning: variable "node" is used before its value is set
   in->fingering( Ambiguity( conf, node ) );
                                   ^

"ComeauTest.c", line 47: error: "Ambiguity::Ambiguity(Ambiguity &)", required for
           copy that was eliminated, is not callable because reference
           parameter cannot be bound to rvalue
   in->fingering( Ambiguity( conf, node ) );
                  ^

1 error detected in the compilation of "ComeauTest.c".
In strict mode, with -tused, Compile failed
Hit the Back Button to review your code and compile options.


--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[2]: GCC 4.0 vs older code.
От: SkyDance Земля  
Дата: 28.07.05 14:15
Оценка:
"MaximE" <5711@users.rsdn.ru> wrote in message news:1296912@news.rsdn.ru...
> "ComeauTest.c", line 47: error: "Ambiguity::Ambiguity(Ambiguity &)",
> required for
> copy that was eliminated, is not callable because reference

Так в этом и дело — кому это Ambiguity стал required for copy? Ведь он
передается по константной ссылке — const Ambiguity&
То есть копирования происходить не должно. Или он имеет в виду, что, вот
если бы объект передавался не по ссылке, тогда бы потребовалось копирование
?
Posted via RSDN NNTP Server 1.9
Re[3]: GCC 4.0 vs older code.
От: MaximE Великобритания  
Дата: 28.07.05 14:20
Оценка:
SkyDance wrote:

> "MaximE" <5711@users.rsdn.ru> wrote in message news:1296912@news.rsdn.ru...

>> "ComeauTest.c", line 47: error: "Ambiguity::Ambiguity(Ambiguity &)",
>> required for
>> copy that was eliminated, is not callable because reference
>
> Так в этом и дело — кому это Ambiguity стал required for copy? Ведь он
> передается по константной ссылке — const Ambiguity&
> То есть копирования происходить не должно. Или он имеет в виду, что, вот
> если бы объект передавался не по ссылке, тогда бы потребовалось копирование
> ?

Аргументы ф-ций are copy initialized. Т.е.

int f(T t);

f(1); // == f(T(T(1));


Хотя ненужные копии будут удалены компилятором, copy constructor все равно должен быть доступен.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[4]: GCC 4.0 vs older code.
От: SkyDance Земля  
Дата: 28.07.05 14:24
Оценка:
"MaximE" <5711@users.rsdn.ru> wrote in message news:1296948@news.rsdn.ru...
> Аргументы ф-ций are copy initialized. Т.е.
> int f(T t);
> f(1); // == f(T(T(1));

Ага. Но там-то другое:

int f(T& _rt);

f( T(2) ); // == f( T(2) ) — reference bound to temporary object

Или для копирования ссылки нужен copy constructor?
Posted via RSDN NNTP Server 1.9
Re: GCC 4.0 vs older code.
От: Павел Кузнецов  
Дата: 28.07.05 14:28
Оценка: 1 (1)
SkyDance,

S> Судя по всему, он хочет видеть конструктор копирования в классе

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

S> Хочет он его для temporary объекта для передачи в функцию. Но ведь

S> создавать копию объекта ему не надо — объект передается по ссылке, да
S> еще и константный!

В случае привязки (константной) ссылки к rvalue компилятор имеет право создать
столько временных копий оригинального rvalue, сколько посчитает нужным. Даже
если он эти временные копии не создает, а привязывает ссылку к оригинальному
rvalue, он все равно должен убедиться в копируемости объекта.

8.5.3/5
<...>
— If the initializer expression is an rvalue, with T2 a class type, and “cv1 T1”
is reference-compatible with “cv2 T2,” the reference is bound in one of the
following ways (the choice is implementation-defined):
— The reference is bound to the object represented by the rvalue (see 3.10)
or to a sub-object within that object.
— A temporary of type “cv1 T2” [sic] is created, and a constructor is called
to copy the entire rvalue object into the temporary. The reference is bound
to the temporary or to a sub-object within the temporary. 93)
The constructor that would be used to make the copy shall be callable whether
or not the copy is actually done.
<...>
93) Clearly, if the reference initialization being processed is one for the first
argument of a copy constructor call, an implementation must eventually choose
the first alternative (binding without copying) to avoid infinite recursion.


S> Но интересно, почему же компиляторы ведут себя по разному и что


Компиляторы ведут себя по-разному, т.к. не все реализуют проверку, требуемую
в данном случае стандартом.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[5]: GCC 4.0 vs older code.
От: Bell Россия  
Дата: 28.07.05 14:37
Оценка:
Здравствуйте, SkyDance, Вы писали:

SD>"MaximE" <5711@users.rsdn.ru> wrote in message news:1296948@news.rsdn.ru...

>> Аргументы ф-ций are copy initialized. Т.е.
>> int f(T t);
>> f(1); // == f(T(T(1));

SD>Ага. Но там-то другое:


SD>int f(T& _rt);


SD>f( T(2) ); // == f( T(2) ) — reference bound to temporary object


SD>Или для копирования ссылки нужен copy constructor?

При инициализации константной ссылки r-value возможно 2 варианта: привязка к исходному временному объекту, или привязка к копии этого временного объекта. Однако копия не можежет быть сделана, потому что конструктор копирования Ambiguity принимает аргумент по неконстантной ссылке.
Любите книгу — источник знаний (с) М.Горький
Re[3]: GCC 4.0 vs older code.
От: aton Россия http://ruby.inuse.ru
Дата: 28.07.05 14:38
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>aton wrote:


>> Здравствуйте, SkyDance, Вы писали:

>>
>> SD>Понятно, что можно удовлетворить всех, сделав конструктор копирования. Но интересно, почему же компиляторы ведут себя по разному и что конкретно не устраивает GCC 4.0 ?
>>
>> как известно gcc 4.0 очень нестабилен, попробую одновиться до 4.0.1

ME>Приведи ссылку на "как известно". Дистрибутив Fedora Core 4 весь скомпилирован gcc 4.0.0, а тестинг у FC4 нехилый был.


ME>--

ME>Maxim Yegorushkin

погугли сам все увидиш

> а тестинг у FC4 нехилый был


голословное заявление, ссылку
Re[4]: GCC 4.0 vs older code.
От: MaximE Великобритания  
Дата: 28.07.05 14:51
Оценка:
aton wrote:

[]

> погугли сам все увидиш


Гуглил, не нашел ничего конкретного.

>> а тестинг у FC4 нехилый был

>
> голословное заявление, ссылку

http://linux.slashdot.org/linux/05/06/13/1433254.shtml -> поиск по слову test

Fedora is the first place they often get tested

Er, no.

Rawhide is where things first get tested.


After that, Fedora Core 4 beta 1


After that, Fedora Core 4 beta 2


After that, Fedora Core 4 beta 3


After that, Fedora Core 4 beta 4


After that, Fedora Core 4


After that, Red hat Enterprise Linux.

Fedora works. It has a lot of texting. Report a bug, and someone will fix it. That someone probably works for Red Hat.

RHEL works too. And it's a lot more conservative — which yes, probably means it's a little more reliable, but doesn't mean FC is unreliable or a beta test. See bullet points above. Stability is a yes no thing, it's a more or less thing.

People don't buy RHEl cause FC is unstable. They buy RHEL so they can install a box this year and get 24/7 support, and training, and not have to upgrade, till 2011.


--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[5]: GCC 4.0 vs older code.
От: MaximE Великобритания  
Дата: 28.07.05 14:54
Оценка:
MaximE wrote:

> aton wrote:

>
> []
>
>> погугли сам все увидиш
>
> Гуглил, не нашел ничего конкретного.

Кроме списка багов пофиксенных в 4.0.1 http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&amp;resolution=FIXED&amp;target_milestone=4.0.1

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[6]: GCC 4.0 vs older code.
От: aton Россия http://ruby.inuse.ru
Дата: 28.07.05 16:23
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>MaximE wrote:


>> aton wrote:

>>
>> []
>>
>>> погугли сам все увидиш
>>
>> Гуглил, не нашел ничего конкретного.

ME>Кроме списка багов пофиксенных в 4.0.1 http://gcc.gnu.org/bugzilla/buglist.cgi?bug_status=RESOLVED&amp;resolution=FIXED&amp;target_milestone=4.0.1


Ключевое слово 4.0.1

ME>--

ME>Maxim Yegorushkin
Re[6]: GCC 4.0 vs older code.
От: SkyDance Земля  
Дата: 29.07.05 05:14
Оценка:
"Bell" <3057@users.rsdn.ru> wrote in message news:1296988@news.rsdn.ru...
> При инициализации константной ссылки <...>

Спасибо!
Павел Кузнецов уже объяснил, причем с теми пунктами в стандарте, мимо которых я десять раз прошел... эх, моя невнимательность
Posted via RSDN NNTP Server 1.9
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.