Constantine
Собственно говоря я могу дать простой ответ, почему это не может быть UB
Дело все в том, что возвращенный объект не мог быть создан как const
Ioann_
Константность объекта мягко говоря для компилятора говорит лишь в какую память он может записать данный объект
Ioann_
Я думаю, что ub как раз да, когда внутри мк будет что то интересное происходить
Ioann_
Constantine
Кроме того, что объект нельзя менять
Constantine
Это все ответы на стек оверфлоу
Constantine
он никогда так не сделает
Constantine
потому что этой гарантией нельзя воспользоваться
Ioann_
Вот честно скажу, я как то собеседовался в некоторве места - и такие надуманные ситуации спрвшивали, что волосы дыбом вставали. Но к счастью я неплохо тогда задротил стандарт :)
Constantine
собственно Антон Полухин утверждал, что все компиляторы просто игнорируют const :)
Ioann_
собственно Антон Полухин утверждал, что все компиляторы просто игнорируют const :)
Это мб если речь о интел архитектуре идет. А если плисы и всякие другие arm ?
Constantine
В данном случае объект не мог быть const изначально
Constantine
Именно
Constantine
Но
Constantine
Автор в любом случае не мог создать этот объект как const
Constantine
Не мог
Constantine
ну или пример кода, я не представляю его
Constantine
он должен вернуть const T
Constantine
заметь
Constantine
для не CC типа
Constantine
я понимаю, что const& нельзя консткастить и модифицировать
Constantine
потому что 2 можно передать по const&
Constantine
но здесь речь идет о user-defined не CC типе
Constantine
я не понимаю даже как его вернули из функции, если он был объявлен как const внутри функции
Constantine
в любом случае возвращаемое значение функции по сути возвращено по ссылке
Ioann_
Самая моя большая ошибка при изучении плюсов была в том, что я пытался найти логику
Constantine
в плюсах все безумно хорошо с логикой языка
Constantine
и безумно плохо с логикой людей, которые пытаются на нем писать
Ioann_
Не знаю, самое простое и верное решение, это действительно следовать стандарту и никак иначе
Constantine
так вот, мне совершенно не очевидно, как компилятор вернет значение типа T через регистр
Constantine
нет ни одного доказательства, что эта программа с const_cast является ill formed
Constantine
пока
Constantine
кроме мнения рандомных людей со стек оверфлоу
Constantine
стандарта
Ioann_
Я с телефона, поищу и как время найду и как за нетбуком буду :) Но это не шибко быстро будет.
Constantine
например
Constantine
T const && x = f<T😠);
Constantine
очевидно корректная строка, нет?
Constantine
T const&& x = f<T>();
Constantine
три раза тильда чтобы не реплейсило
Constantine
ой не тильда
Constantine
`
Constantine
вот этот знак
Constantine
писать до блока кода и после
Constantine
((( код (((
Constantine
русское название пожалуйста
Constantine
я фанатический сторонник использования русского языка, пока речь не идет о терминах, которые я пишу по-английски
Constantine
Это диакритический знак, одиночный символ так же называется?
Constantine
а, этот знак называется обратный апостроф, действительно
Ioann_
Но, вот эта штука точно дает UB, на счет той поищу: struct S{ std::vector<S> v;};
Ioann_
То есть так можно просто суффиксное дерево построить :)
Constantine
Это просто явно вообще непонятно что
Ioann_
Ну это просто пример из жизни
Constantine
Хотя кстати наличие возможного mutable поля у структуры - одна из причин, почему компилятор не может ничего оптимизировать на тему const
Constantine
Это не UB
Constantine
но там есть прикол
Constantine
вот такой
Ioann_
Это не UB
Это стопроцентный уб
Constantine
вот такой
Constantine
struct Node { std::vector<Node> children; } root; void push_up(){ if (root.children.empty()) return; root = root.children[0]; //UB }
Ioann_
Потому что стандарт разрешает
Constantine
вот это - UB
Constantine
а объявление структуры - не UB
Ioann_
Неполные объявления типов
Constantine
неполные что простите?
Ioann_
В структурах можно в using или в указателях
Constantine
тип S полностью определен в объявлении S
Ioann_
Но если ты используешь в stl то ет гарантии
Constantine
что вы хотите мне сказать?
Ioann_
Что этот контейнер будет использовать данный тип как неполный
Constantine
что я не могу использовать std::vector<S>?
Constantine
вы шутите?
Constantine
вы точно читали стандарт?
Ioann_
Сейчас скину
Constantine
Только пожалуйста не stack overflow