Когда объявление локальной переменной как нестатической constexpr полезно/обязательно?

Несмотря на чтение некоторых сообщений StackOverflow (это и это) и cppreference, я не могу понять, чем нестатическая constexpr локальная переменная будет полезна по сравнению с static constexpr одной.

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

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

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


person Reizo    schedule 09.07.2020    source источник
comment
С практической точки зрения никакой разницы не будет.   -  person SergeyA    schedule 09.07.2020
comment
Помните, что начиная с C++11 статические переменные гарантированно имеют потокобезопасную инициализацию. Это означает, что они будут стоить вам каждый раз, когда вы вызываете функцию, так как она должна проверять, была ли она инициализирована. Нестатическая переменная constexpr просто будет увеличивать стек (если она вообще это сделает, поскольку ее можно было бы оптимизировать), что очень дешево и быстро.   -  person NathanOliver    schedule 09.07.2020
comment
Последний абзац ответа stackoverflow.com/a/13867690/1023911 дает несколько советов, когда не следует использовать static.   -  person Werner Henze    schedule 09.07.2020
comment
@WernerHenzeyes, спасибо. Я действительно читал это, но для меня это было недостаточно убедительно, чтобы не заставлять меня все еще удивляться.   -  person Reizo    schedule 09.07.2020
comment
@NathanOliver эта ситуация кажется мне довольно особенной. Я искал что-то более «обычное». Но, конечно, у вас есть веская точка зрения.   -  person Reizo    schedule 09.07.2020
comment
Я даже не уверен, что есть преимущество в том, чтобы на самом деле иметь переменную в первую очередь, поскольку RHS также должен быть constexpr. Если вы просто используете RHS где-то в функции, компилятор все равно может вычислить ее во время компиляции и превратить в константу. Единственный случай, который я могу придумать, где вы хотели бы, чтобы это была переменная, - это если вы используете ее несколько раз в функции и не хотите дублировать RHS, или если вам нужно взять указатель на нее.   -  person cdhowie    schedule 10.07.2020