Разрешено ли объявить неконстантную ссылку как constexpr
? Пример кода:
int x = 1;
constexpr int& r = x;
Это принимается gcc и clang (я пробовал несколько текущих и прошлых версий обеих, вернувшись к C ++ 11, и все приняли это). Однако я думаю, что это не следует принимать, потому что C ++ 14 [dcl.constexpr / 9] говорит:
если спецификатор constexpr используется в объявлении ссылки, каждое полное выражение, которое появляется в его инициализаторе, должно быть постоянным выражением
и x
не является постоянным выражением.
Язык в последнем проекте [dcl.constexpr] на C ++ 17 изменился и даже не упоминает constexpr
ссылки явно, я не могу понять, что он пытается сказать о них.
x
не является постоянным выражением? - person T.C.   schedule 21.04.2017x
не является основным постоянным выражением {{требуется цитирование}} - person T.C.   schedule 21.04.2017e
является основным константным выражением, если оценкаe
не будет оценивать одно из следующего: [...] преобразование lvalue-to-rvalue, если оно не применяется к [случаям, когда этот код не ' т совпадение] - person M.M   schedule 21.04.2017x
присваивается буквальное значение, разве этого не должно быть достаточно для компилятора, чтобы знать, что время компиляции известно? - person asimes   schedule 21.04.2017x
требуется преобразование lvalue-to-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