Мы, очевидно, не можем сделать все constexpr
. И если мы ничего не сделаем constexpr
, то проблем не будет. До сих пор было написано много кода.
Но хорошо ли шутить constexpr
во всем, что может иметь это? Есть ли потенциальная проблема с этим?
Мы, очевидно, не можем сделать все constexpr
. И если мы ничего не сделаем constexpr
, то проблем не будет. До сих пор было написано много кода.
Но хорошо ли шутить constexpr
во всем, что может иметь это? Есть ли потенциальная проблема с этим?
Он не будет беспокоить компилятор. Компилятор будет (или должен все равно) дать вам диагностику, когда/если вы используете ее для кода, который не соответствует требованиям constexpr
.
В то же время я был бы немного нерешительным, чтобы просто похлопать его там, потому что вы могли. Несмотря на то, что это не будет/не будет беспокоить компилятор, ваша основная аудитория - это другие люди, читающие код. По крайней мере, IMO, вы должны использовать constexpr
, чтобы передать им довольно конкретный смысл, и просто похлопывать его по другим выражениям, потому что вы можете ввести в заблуждение. Я думаю, что читателю было бы интересно узнать, что происходит с функцией, обозначенной как constexpr
, но используется только как обычная функция времени выполнения.
В то же время, если у вас есть функция, которую вы честно ожидаете использовать во время компиляции, и вы ее еще не использовали, обозначение ее как constexpr
может значительно улучшить смысл.
Почему я не пытаюсь попробовать constexpr
при каждой возможности в виде списка и в каком-либо конкретном порядке:
std::get
появился несколько раз недавно)Функции Constexpr имеют так много ограничений, что они являются нишей для специального использования. Не оптимизация или желаемый супер-набор функций в целом. Когда я пишу один, это часто потому, что метафунк или обычная функция сами по себе не сократили бы его, и у меня есть особый настрой для этого. Функции Constexpr не обладают вкусом, как другие функции.
У меня нет конкретного мнения или совета по конструкторам constexpr
, потому что я не уверен, что могу полностью обдумать их, а пользовательские литералы пока недоступны.
Да. Я считаю, что такая const
не всегда хорошая практика, где бы вы ни были. Например, в вашем class
, если данный метод не модифицирует какой-либо член, тогда вы всегда ставите ключевое слово const
в конце.
Помимо языкового аспекта, упоминание const
ness также является хорошим показателем для будущего программиста/рецензента, что выражение имеет константу внутри этого региона. Это относится к хорошей практике кодирования и добавляет читаемость также. например (из @Luc)
constexpr int& f(int& i) { return get(i); }
Теперь добавление constexpr
предполагает, что get()
также должен быть constexpr
.
Я не вижу никаких проблем или последствий из-за constexpr
.
Изменить. Дополнительным преимуществом constexpr
является то, что вы можете использовать их как аргумент template
в некоторых ситуациях.
Я склонен согласиться со Скоттом Мейерсом в этом (как и в большинстве случаев): "Используйте constexpr
, когда это возможно" (из пункта 15 "Эффективного современного" C++), особенно если вы предоставляете API для использования другими. Это может быть очень разочаровывающим, если вы хотите выполнить инициализацию во время компиляции с использованием функции, но не можете, потому что библиотека не объявила об этом constexpr
. Кроме того, все классы и функции являются частью API, независимо от того, используются ли они миром или только вашей командой. Так что используйте его, когда можете, чтобы расширить сферу его применения.
// Free cup of coffee to the API author, for using constexpr
// on Rect3 ctor, Point3 ctor, and Point3::operator*
constexpr Rect3 IdealSensorBounds = Rect3(Point3::Zero, MaxSensorRange * 0.8);
Тем не менее, constexpr
является частью интерфейса, поэтому, если интерфейс не соответствует естественным образом чему-то, что может быть constexpr
, не выполняйте его, чтобы позже вам не пришлось нарушать API. То есть, не передавайте constexpr
интерфейсу только потому, что текущая, только реализация может его обработать.