Re
” if I replaced the constexpr word with const all above worked correctly."
const int*
по существу означает (const int)*
, за исключением того, что вы не можете использовать круглые скобки. A constexpr int*
означает constepxr (int*)
(с тегом).
Это потому, что constexpr
не является типом, вы не можете назвать тип constexpr int
, скажем, в то время как const
является частью этого типа.
Вместо
constexpr int i = 0;
constexpr int& ri = i;
, которая пытается объявить constexpr
ссылку непредставленных const
, просто написать
constexpr int i = 0;
constexpr int const& ri = i;
Вы можете прочитать, что в обратном направлении, как ri
является ссылка на const
int
, который constexpr
(оценивается во время компиляции).
Добавление:
Это ¹appears, что C++ 14 требует от местных Непро- static
constexpr
объекты имеют автоматическую продолжительность хранения, по модулю как если бы правила для оптимизации.
Для удовлетворения этого, то есть, чтобы сделать код переносимым для компиляторов, если вышеуказанные заявления появляются локально в функции, добавьте static
, чтобы обеспечить статическую продолжительность хранения для объекта, один относится к:
void oops()
{
static constexpr int i = 0; // Necessary with some compilers.
constexpr int const& ri = i;
}
В противном случае он не может компилироваться, например g ++, и это , вероятно,, что требуют стандарты C++ 14 и C++ 11, путем исключения подходящих ограничений на constexpr
.
Примечания:
¹ ВИДЕТЬ discussion of R. Sahu's answer.
Возможный дубликат: http://stackoverflow.com/questions/13346879/const-vs-constexpr-on-variables –
Вы забыли константным спецификатором 'constexpr ИНТ сопзЬ & п = я;'. 'constexpr int i = 0;' также объявлять 'i' как const ... [demo] (http://melpon.org/wandbox/permlink/2oc2VMdtymZ93ANa) –
Возможный дубликат [const vs constexpr on variables] (http: //stackoverflow.com/questions/13346879/const-vs-constexpr-on-variables) – Swapnil