🦥Alex Fails
This is an Russian C++ Chat. If you want any help with it, speak Russian or go to International chat: https://t.me/joinchat/AAAAAD_cJVeMzHBQMtxB5w
Ioann_
la teroristo :?
Berkus
🦥Alex Fails
Ну да, там уровень дискуссии как в ультрамегапро. Но Стас и остальные участники этого чата стараются поднимать уровень того чата
vladislav
а что в ультрамегапро? Боюсь заходить :)
🦥Alex Fails
#ultramegapro
Vladislav
Vladislav et berkus Répondez
Pardon, jewelry ne parle pas français) just a little bit
Ioann_
А как понять какого уровня человек, чтобы понять в какой из чатов стоит идти :?
🦥Alex Fails
в этом обычно помогаю я, или кто-то другой
vladislav
А как понять какого уровня человек, чтобы понять в какой из чатов стоит идти :?
Не работаешь, учишься, не учавствовал в крупных проектах — супапро Зарабатываешь программированием на C++ себе на корку хлеба — про Ультравмегапро, видно, для уникумов :) Ну, это как я вижу.
Ioann_
А есть ли здесь тимлиды :?
Ioann_
Из активных
vladislav
Тут и люди из комитета по стандартизации есть :)
vladislav
в количестве одной штуки
Ioann_
Комитет по стандартизации это такое себе - ну то есть, есть и есть.
Ioann_
Так значит есть :?
vladislav
Думаю, есть. Тут, видимо, не принято сообщать о своей должности, по крайней мере я такого не встречал.
Ioann_
Тогда могу закинуть сюда вопросик, кое какой. Интересно было бы послушать как бы вы разобрали эту ситуацию:
Ioann_
Есть некая функция template<class T> const T f(){}
Ioann_
Возвращает константу как видно, так же есть некий класс C, у которого определен конструктор перемещения для не константных объектов, а конструктор копирования помечен как deleted
Constantine
Вангую вопрос про copy elision для function return value
Ioann_
Теперь бы хотелось написать некоторую функцию, вот такую: C f1(){return f<C>()
Ioann_
Как это можно сделать, в рамках верности стандарту :?
Constantine
Зачем вообще нужно возвращать const T?
Constantine
Это немного... нелогично
Ioann_
Ну, ето такое - у меня это было из внешней либы
Constantine
По сути возврат const T это само по себе некоторое насилие над языком
Ioann_
То есть не моей :) так что ответ на сий вопрос мне не известен. Но вот что есть то есть, и вопрос как это разрулить по красоте :?
Constantine
Я бы в данном случае без зазрения совести написал const_cast
Ioann_
Желательно без использования google
Constantine
И выбросил бы либу
Ioann_
UB
Ioann_
Я бы в данном случае без зазрения совести написал const_cast
Constantine
?
Ioann_
Конст каст дает уб. Так как если объект был изначально константой
Ioann_
То ... ну вы думаю знаете :)
Constantine
Вопрос недостаточно специфицирован
Constantine
Что значит объект изначально был константой?
Berkus
То ... ну вы думаю знаете :)
я вообще на бейсике пишу, давай рассказывай
Constantine
+1
Constantine
я не представляю, как здесь можно получить UB
vladislav
Я тоже не понял, зачем возвращать const T, ладно бы это референс был или ссылка, но либа возвращающая мне константный объект...
Constantine
здесь нет ссылки
Constantine
вот если возврат идет T const& то const_cast может дать UB, я понимаю
Ioann_
return const_cast<C&&>
Ioann_
Я так понимаю ты это имел ввиду ?
Ioann_
Так как конструктор копирования у нас delete
Ioann_
В таком случае это действительно UB.
Ioann_
Но у этой задачи в реальности есть решение :) Без UB
Ioann_
В общем, что бы вас не томить рассказываю
Ioann_
Можно создать некоторую структур обертку - у которой будет mutable поле
Ioann_
Ну и через этот mutable делать возврат
Ioann_
Тоесть так: struct S{ mutable C a;}
Ioann_
А в функции писать так: return f<S>().a
Constantine
Этой задачи не существует
Constantine
Помечать возвращаемое значение как const это что-то между моветон и ошибка
Constantine
Любой пример
Constantine
Цитаты из стандарта
Berkus
Я так понимаю ты это имел ввиду ?
https://wandbox.org/permlink/rtzCT2W6xD4z9105 так или я что-то упустил?
Ioann_
Существует, пруфы я конечно так просто не найду уже, но у товарища из Яндекса была именно такая ситуация. Он кстати заядлый олимпиадник - Петр Калинин
Anonymous
Дорога к С++20 https://habrahabr.ru/post/333414/
Ioann_
https://wandbox.org/permlink/rtzCT2W6xD4z9105 так или я что-то упустил?
То что все скомпилировалось не говорит о том что все в рамках стандарта.
Constantine
Существует, пруфы я конечно так просто не найду уже, но у товарища из Яндекса была именно такая ситуация. Он кстати заядлый олимпиадник - Петр Калинин
Хм... не очень знаю, кто это. Я хочу увидеть пример кода, причину возврата const T, проблемный компилятор и цитаты стандарта. В частности, я почти уверен, что в данном случае const вообще не влияет на генерируемый код
Ioann_
У меня например компилится вот такое struct S{ std vector<S> V }
Ioann_
Почитать можно тут: https://stackoverflow.com/questions/37418387/const-cast-and-stdmove-to-remove-constness-from-non-reference
Stanislav
Сове хорошо - нам хорошо.
а чо сразу сова то
Stanislav
Constantine
Почитать можно тут: https://stackoverflow.com/questions/37418387/const-cast-and-stdmove-to-remove-constness-from-non-reference
Вам накидать три десятка принципиально ошибочных ответов на стек оверфлоу?
Constantine
В тексте нет ссылок на стандарт
Ioann_
Да все возможно. Наверное, это следовало бы сделать мне, ибо уже проделывал. Но мне лень :)
Constantine
Собственно говоря я могу дать простой ответ, почему это не может быть UB
Constantine
В любом случае весь вопрос в том, какой смысл вкладывал автор в написанное const
Ioann_
Ну самое простое это призвать сюда чуваков из pvs studio