LINUX.ORG.RU

баг в gcc 3.3.6 ?


0

0

Тестовый пример:

#include <cstdlib>
#include <string>

using std::string;

static const char *f() { return "a"; }

int main()
{
char *b="b", *c="c";
string s(string(f())+b+c);
return EXIT_SUCCESS;
}

gcc 3.3.6 говорит что ошибка в строке
> string s(string(f())+b+c);

gcc 3.4 gcc 4.0 icc 7.1.006 говорит что все хорошо.

Действительно ошибка в синтаксисе которую замечает только gcc 3.3.6
или это баг gcc?

anonymous

Ответ на: комментарий от anonymous

>Сделай так string s((string((f()))+b+c)) (т.е. добавь скобочки) и расскажи о >результате.

Да какая фиг разница, починить можно например можно так
string s=... вместо s( или вот так const char *a=f(); string s(string(a)+b+c)

меня интересует это баг или нет?

anonymous
()
Ответ на: комментарий от anonymous

> меня интересует это баг или нет?

Сделай как я сказал (добавь скобочки) и расскажи о результатах.

Если поможет, то это не баг, а тонкое место в C++, которое разные компиляторы могут интерпретировать по-разному.

anonymous
()
Ответ на: комментарий от anonymous

>Если поможет, то это не баг, а тонкое место в C++, которое разные компиляторы >могут интерпретировать по-разному.

помогло, и в чем тонкое место, и почему другие компиляторы это проглатывают?

anonymous
()

гусь думает что это объявление функции, такое часто бывает, поэтому
принято писать:

string s = string(f())+b+c;

( в случае конструктора с одним параметром )

aton
()
Ответ на: комментарий от aton

>string s = string(f())+b+c;

но таким образом вместо
создание временного объекта f()+b+c и
вызов конструктора копии s(временный объект)

происходит
создание временного объекта, создание пустого объекта s,
вызов operator=,

вариант со скобочками вокрут (string(f())) мне нравиться больше.

Спасибо за участие брат анонимус

anonymous
()
Ответ на: комментарий от anonymous

> Спасибо за участие брат анонимус

Братьев было больше одного ;)

А про вызов operator=() довольно распространенное заблуждение. Его не происходит при описании вида A_CLASS AN_OBJECT = a_value.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.