LINUX.ORG.RU

Возвращение константных значений

 ,


0

2

Зачем делать вот такие вещи в С и C++:

const int f()
{
   ...
}

Не константные ссылки, а именно константные значения. Ведь все равно квалификатор будет проигнорирован компилятором. Я задавал этот вопрос автору кода, но он ничего не ответил.

★★★★★

Для создания тредов на ЛОРе.

LamerOk ★★★★★
()

Просто товарищ перепутал С++ и С.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от hibou

Нет, там не было никаких вычислений во время компиляции, только рантайм логика.

seiken ★★★★★
() автор топика

Автору вы вопрос случайно не на хинди задавали?

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

нет, не Константин и не Григорий. И вообще он индус.

seiken ★★★★★
() автор топика

Ведь все равно квалификатор будет проигнорирован компилятором.

Именно так. Здесь квалификатор лишний.

Хотя есть случаи , когда константное возвращаемое значение имеет смысл.

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

https://habr.com/ru/post/183454/ Return by value и const variables в C++11

Предположим, что у структуры s есть и конструктор копирования, и конструктор перемещения, а 
функция f содержит код, препятствующий применению RVO. 
Что же произойдет с объектом r при возврате из 
функции? Если объект создан без спецификатора const, то при 
возврате из функции он будет перемещен, а если создан с const — скопирован.

Умеют однако УМНЫЕ головы на ровном месте найти ухабы …

Vladimirmir
()

пригласи автора кода на ЛОР и задай ему этот вопрос здесь.

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

Еще раз: нет там никаких ссылок. Нет ссылок.

Код показать не могу, ибо закрытый он. Но идея такая:

class X
{
private:
   int member;
};

const int X::getMemberValue()
{
   return member;
}

Т.е. это просто геттер и ничего он не изменяет. Но при этом метод неконстантный, хотя C++11 давно уже поддерживается (!)

seiken ★★★★★
() автор топика

Я задавал этот вопрос автору кода, но он ничего не ответил.

epic. long live stack overflow!

anonymous
()

Например, этого может требовать какой-то из трейтов шаблона. Хотя, возможно правила выведения типов подставят этот const автоматически без проблем.

pon4ik ★★★★★
()

Я задавал этот вопрос автору кода, но он ничего не ответил.

Ну вот, хорошо что «до свадьбы» разобрался )). Я вот недавно тоже полез либу заюзать одну, а там автор шлет эксепшены в совершенно неуместных случах, где надо возвращать ошибку. Или другая либа - там auto_ptr юзаются. Кончено, пользоваться я этим не стал.

pavlick ★★
()
Ответ на: комментарий от pon4ik

Например, этого может требовать какой-то из трейтов шаблона.

Я могу понять, если какой-то транслятор генерит функции, возвращающие const T& - тогда можно не беспокоиться, что Т примитивный тип или класс, и мысль «не изменяй меня» будет доведена явно до пользователя и усилена проверками компилятора, и с другой стороны, будет уверенность, что компилятор не будет делать RVO, и никаких копий об’екта не будет. Но когда возвращается const T… Я в том смысле, что если есть какой-то трейт шаблона, он должен иметь смысл в конкретных инстанциированных классах. Если такого смысла нет, то и нет смысла вводить такой трейт.

seiken ★★★★★
() автор топика

имхо может быть вполне релевантно. например эта функция содержит какое-то сложное логическое варажение. то, что его вынесли в функцию, не значит, что результат можно менять. то есть причины могут быть чисто идеологические, когда более релевантный тип данных для значения - константа. ну вот функция pi() вполне может возращать константу так как если что-то не константно, значит ты собираешься это менять, а с какого перепуга ты собрался менять число пи..

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

например эта функция содержит какое-то сложное логическое варажение. то, что его вынесли в функцию, не значит, что результат можно менять

как сишка или плюсы воспротивятся изменению, если возвращаемое константное значение присваивается неконстантной переменной? Эта константность вообще не существует, она эфемерна, ибо (по крайней мере, в примере с геттером) внутри функции значение члена можно и поменять. Т.е. константность существует только в момент возврата, после дальнейшего присваивания она уже не играет роли.

ну вот функция pi() вполне может возращать константу

так все таки «сложные вычисления» или возврат константы? В сишке и плюсах пи - константа и никаких «сложный вычислений». А скорее всего тупо препроцессорное макро-определение, так что изменить его без порнографии в рантайме нельзя при всем желании

seiken ★★★★★
() автор топика
Ответ на: комментарий от seiken

как сишка или плюсы воспротивятся изменению

Например передаешь как параметр (без промежуточной переменной), а там int& а должен быть const int&. Или на основании возращаемого значения вычисляется параметр шаблона. В целом ты не знаешь как будут (или даже будешь сам) использовать функцию.

так все таки «сложные вычисления» или возврат константы?

Ну это я как пример привел, другой пример. Функция может возращать не double а какой нибудь биг инт. И там могут быть вычисления для заданной точности пи.

Еще это может быть ширина монитора..

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

Хотя int& не соберется ибо нельзя неконстантную ссылку на временную переменную..

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

ну и в добавок это может быть документацией для программита, код читающего. если бегло посмотреть на загловок функции, то станет понятно, что возращается некая константа.

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

а там int& а должен быть const int&. Или на основании возращаемого значения вычисляется параметр шаблона. В целом ты не знаешь

Нет, не должно быть, и да, знаю. Короче, надо как-то больше давить на людей в процессе ревью, чтобы такого говнокода не было.

seiken ★★★★★
() автор топика
Ответ на: комментарий от seiken

Логично, но этот трейт может выводиться на основе другого трейта и т.п.

Это метапрограммирование на шаблонах то ещё развлечение. Т.е. в идеальном мире с понями и радугой - ты 100% прав, но если язык позволяет такое ограничение сделать, его кто-то мог и сделать, осознанно или нет это уже 10ый вопрос. Я кста пока не уверен можно ли вообще так ограничить для типа возвращаемого по значению.

pon4ik ★★★★★
()
Ответ на: комментарий от seiken

и да, знаю

сегодня знаешь, а как через год - не знаешь (а если знаешь, то у меня к тебе пара вопросов - хочется выгодную ставку сделать, разбогатеть...).

говнокода

что называть говнокодом? это написать не трудно, лишних действий от вызываюего не требует, самодокументируемость кода повышает. по каким критериям константность возращаемого значения по значению - говнокод?

в процессе ревью

имхо бесполезная придирка, что касается именно ревью.

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

Это метапрограммирование на шаблонах то ещё развлечение.

Никогда его не использовал и использовать не буду.
Похоже «усовершенствователи» C++ не понимают концептуальной разницы между терминами «метапрограммирование» и «мета данные» …

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

Всё хорошо в меру, категоричность это удел максималистов.

Согласен с вами, но в данном случае не просто какая-то там фанатичность, а разрабатываемый и реально используемый API.
То бишь, то о чем сказал это «не бросание какашек».

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

В API (если это не библиотека метапрограммирования или библиотека шаблонов) и правда шаблонов должно быть минимум. Но про шаблоны это вообще чисто предположение было, что они замешаны в косяках этого конкретного API.

pon4ik ★★★★★
()

Думаю, основной язык у человека писавшего код другой, и он таким образом хотел обозначить строго инкапсулированную функцию возвращающую константу.

Тред раздули ни о чем. Тем более для какой архитектуры код, может там оптимальный asm для контроллера получается.

Stack77
()
Последнее исправление: Stack77 (всего исправлений: 1)
Ответ на: комментарий от Stack77

Закрытый код с заданием пованговать.

ИМХО для меня МНОГО важнее мнение других разработчиков, а не их конкретный код …

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

ИМХО для меня МНОГО важнее мнение других разработчиков, а не их конкретный код …

Потому-то корпорации и любят устраивать всякие «тусовки» программистов и разработчиков.

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

что называть говнокодом? это написать не трудно, лишних действий от вызываюего не требует, самодокументируемость кода повышает. по каким критериям константность возращаемого значения по значению - говнокод?

Ну если это в Ц коде, то про какую-то самодокументируемость можно порассуждать (хотя сильно спорно). А если ЦПП - то 100% говнокод, которым автор показывает себя, ибо для подобных фокусов есть более надёждные варианты:

class Val {
	friend ...
	int m_val;
	Val() = default;
public:
	int get() {return m_val;}
};
Val fn();

Если встречу у кого-нибудь на каком-нибудь условном гитхабе const int fn(), то скорее всего это будет последим «ревью».

pavlick ★★
()
Ответ на: комментарий от Vladimirmir

ИМХО для меня МНОГО важнее мнение других разработчиков, а не их конкретный код …

Потому-то корпорации и любят устраивать всякие «тусовки» программистов и разработчиков.

Вообще ничего не понял, ну ладно. Здесь как бы на код принято смотреть и форум open source.

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

шаблоны это вообще чисто предположение было, что они замешаны в косяках этого конкретного API

в моем случае там тупо один единственный класс, нужный только чтобы кое какие данные и логику рядом сложить и никаких шаблонов даже в мысли нет, скорее все сделано, чтобы только хоть как-то завелось, чтобы начальство видило, что прогресс есть

seiken ★★★★★
() автор топика
Ответ на: комментарий от Stack77

Тем более для какой архитектуры код, может там оптимальный asm для контроллера получается.

64бит ARM. В асм, разумеется, никто не смотрит, ибо до асма куча уровней оптимизации: 1) более эффективный алгоритм => 2) более эффективный код в рамках ЯП => … и на самом последнем месте асм

seiken ★★★★★
() автор топика

Ну и нахер эти ваши плюсы, если возникают такие вопросы и главное эти вопросы порождают такое бурное обсуждение?

anonymous
()

Копипастеры так пишут а тупые компиляторы варнинги не выдают.

invy ★★★★★
()
Ответ на: комментарий от Vladimirmir

Умеют однако УМНЫЕ головы на ровном месте найти ухабы …

Точнее и не скажешь…

dimgel ★★★★★
()
Ответ на: комментарий от seiken

Похоже на чухню, сгенерированную автоматически в IDE.

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