Минимальный набор кода, 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 ?
Здравствуйте, SkyDance, Вы писали:
SD>Понятно, что можно удовлетворить всех, сделав конструктор копирования. Но интересно, почему же компиляторы ведут себя по разному и что конкретно не устраивает GCC 4.0 ?
как известно gcc 4.0 очень нестабилен, попробую одновиться до 4.0.1
aton wrote:
> Здравствуйте, SkyDance, Вы писали: > > SD>Понятно, что можно удовлетворить всех, сделав конструктор копирования. Но интересно, почему же компиляторы ведут себя по разному и что конкретно не устраивает GCC 4.0 ? > > как известно gcc 4.0 очень нестабилен, попробую одновиться до 4.0.1
Приведи ссылку на "как известно". Дистрибутив Fedora Core 4 весь скомпилирован gcc 4.0.0, а тестинг у FC4 нехилый был.
[]
> Судя по всему, он хочет видеть конструктор копирования в классе 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.
"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&
То есть копирования происходить не должно. Или он имеет в виду, что, вот
если бы объект передавался не по ссылке, тогда бы потребовалось копирование
?
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 все равно должен быть доступен.
"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));
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
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, 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 принимает аргумент по неконстантной ссылке.
Здравствуйте, 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 нехилый был
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.