0xd34df00d
13.05.2011 17:36 Azoth_primary
Какого хуя gcc не предупреждает здесь? Ведь это же UB:
struct T
{
T& foo () { return *this; }
};
T t;
const T& t = t.foo ();
А нахуя ты это делаешь?
сфигали UB?
это чудо, что для такого языка написали хоть какой-то компилятор
где?
По ошибке написал const QString& str = ReturnAString ().replace ("blah", "fooh");
В /5. Пизда str.
откуда компилятору было знать что ты хочешь именно temporary bound, а не то что ты написал?
гхм, а может потому, что написанное тобой полностью валидно?
Orly? А где?
Разверни мысль.
ну как бы ты к const A& присваиваешь объект A
Правда? А где? QString::replace возвращает QString&, модифицируя this.
Собсна, мой пример был бы ближе к истине, если бы я там написал T ().foo ();
1. если бы возвращался объект, а не ссылка, то всё было бы заебись, ибо temporary bound. 2. если погромизд сохраняет ссылку, значит погромизду нужно сохранить ссылку. компилятору западло просчитывать что ссылка эта станет невалидной при переходе за «;»
алсо — нихуя не эквивалент изначального кода
Да. Поэтому пусть это будет ворнингом, а не еггогом.
Более того, компилятор же видит, что справа стоит T&, а не T или хотя бы const T&.
Более того, компилятор и не может это просчитать, если replace не определена прям в qstring.h
Да. Поэтому я исправил в /12.
ну ок. Ты к const A& присваиваешь A&. Так тоже не должно быть?
Да, это чревато.
не дохуяли компилятору просчитывать надо? а если этот твой replace будет делать: g_GlobalStringsMap["blah"]="fooh"; return g_GlobalStringsMap["blah"]?
а const A можно присвоить A?
нихуя не чревато
> ворнингом
> ворнингом
> ворнингом
Потому что я могу писать код в три ночи или ревьювить чужой код и не заметить, что справа от того, что должно быть temporary bound, будет хуита, возвращающая T& на локальный для выражения справа объект. Пусть компилятор покажет мне такие места.
И да, не дохуяли. Пусть лучше разработчики компиляторов ебутся, чем программисты на целевом языке. Хаскель-вей, епта.
Расскажи это попорченному стеку.
Да, если есть конструктор копирования, например.
брось свои личкрафты и иди патчи g++. Вот это будет реально полезное дело
а почему A не может быть B& ?
Я не хочу разбираться в этой блевотной куче ебаного С-говна.
не пизди мне про три ночи, я к этому времени как раз начинаю писать код без ошибок.
Может, если слева у тебя не reference. Написать QString a = QString ().replace (...) валидно, написать const QString& a = QString ().replace (...) — невалидно, пизда тебе, если ты заюзаешь a потом.
эта блевотная куча ебаного С-говна компилирует твои радужные личкрафты, которые при запуске пукают бабочками
Есть гораздо более няшная куча неблевотного неговна на С++ под названием ЛЛВМ и ШЛАНГ.
но они не умеют кьют, да?
Сами кути я ими не собирал. Личкрафты собирал еще год назад, и они уже тогда вполне работали.
и выводили ворнинг на эту строчку, да?
ХЗ. Я тогда еще не угорел по temporary bound.