2015-01-08 1 views
3

Я только что прочитал ответ наБудет ли const и constexpr в конечном итоге быть одним и тем же?

const vs constexpr on variables

и смотрю этот Google Tech Talk about C++11/14 features, в котором говорится, что, ну, constexpr не может быть необходимым в будущем, когда речь идет о функциях, так как компиляторы будут развиваться чтобы понять это самостоятельно. Наконец, я теперь, когда компиляторы Java и JVM усердно работают над тем, что классы (или любая переменная может быть) неизменны после построения - без явного упоминания об этом - и на основе этого факта выполняются всевозможные нечестивые оптимизации.

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

+2

Я, например, я использую constexpr много, чтобы получить чистую и твердую ошибку, если компилятор не может делать то, что я хочу, чтобы это сделать во время компиляции. Я бы предпочел узнать, когда есть проблема, а не заставить ее тихо «фиксироваться». – tux3

+1

не так думают - вполне допустимо принимать адрес переменной 'const', но не' constexpr' –

+0

@RedAlert, без проблем может справиться 'constexpr int i = 10; cout << & i << endl; '. Переменная имеет адрес. Скомпилирован с g ++/clang ++ -pedantic – vsoftco

ответ

5

Нет, никто не заменит другого, у них разные роли. Бьерн Страуструп говорит нам в его C++ FAQ что constexpr не является заменой для сопзЬ и описывает различные роли каждой функции:

Обратите внимание, что constexpr не является заменой общего назначения для сопзЬ (или наоборот):

  • основная функция Const является, чтобы выразить идею, что объект не изменяется через интерфейс (даже при том, что объект может быть очень хорошо модифицированного с помощью других интерфейсов). Так получилось, что объявление объекта const обеспечивает отличные возможности оптимизации для компилятора . В частности, если объявлен объект const, а его адрес не принимается, компилятор часто может оценить его инициализатор во время компиляции (хотя это не гарантируется), и держите , что объект в его таблицах вместо того, чтобы испускать он в сгенерированный код .
  • Основная функция constexpr's заключается в расширении диапазона значений, которые могут быть вычислены во время компиляции, что делает такой тип расчета безопасным. Объекты объявлены constexpr имеют свой инициализатор, оцененный во время компиляции; - это в основном значения, хранящиеся в таблицах компилятора, и только при необходимости генерируются в сгенерированный код.