Разрешено ли е да се декларира неконстантна препратка като constexpr
? Примерен код:
int x = 1;
constexpr int& r = x;
Това се приема от gcc и clang (пробвах няколко текущи и минали версии и на двете, обратно към C++11, и всички го приеха). Въпреки това мисля, че не трябва да се приема, защото C++14 [dcl.constexpr/9] казва:
ако в референтна декларация се използва спецификатор constexpr, всеки пълен израз, който се появява в неговия инициализатор, трябва да бъде постоянен израз
и x
не е постоянен израз.
Езикът в най-новата чернова на C++17 на [dcl.constexpr] се промени и дори вече не споменава изрично constexpr
препратки, не мога да разбера какво се опитва да каже за тях.
x
не е постоянен израз? - person T.C.   schedule 21.04.2017x
не е основен постоянен израз {{необходим цитат}} - person T.C.   schedule 21.04.2017e
е основен постоянен израз, освен ако оценката наe
не оценява едно от следните: [...] преобразуване от lvalue към rvalue, освен ако не се прилага към [случаи, които този код прави' т съвпада] - person M.M   schedule 21.04.2017x
е присвоена литерална стойност, не трябва ли това да е достатъчно добро за компилатора, за да знае, че времето за компилиране е известно? - person asimes   schedule 21.04.2017x
налага преобразуване от lvalue към rvalue върху него? - person T.C.   schedule 21.04.2017x
вместо това ще бъде покрито от /2.9, което предполагам, че има за цел да каже, че id-израз, обозначаващ обект, е постоянен израз, ако е инициализиран с постоянен израз. Не ми е ясно дали това изречение означава (променлива) или (член на данни от референтен тип), или (променлива или член на данни) от референтен тип - person M.M   schedule 21.04.2017int x; template<int&> struct C {}; C<x> c;
Нещо, което може да се използва като аргумент на шаблон, трябва да бъде постоянен израз. - person T.C.   schedule 21.04.2017