Не является ли структура с ссылочным элементом данных литеральным типом?

, I #include <memory> template < int Index , typename Тип > struct position { using value_type = Тип ; template < typename TT > constexpr position ( TT & val ) : значение { val } { } static constexpr int index = Index ; Тип и стоимость ; }; int main () { constexpr double d = 3.14 ; constexpr auto p1 = position < 3 , const double > ( d ). ценность ; // ok constexpr auto p2 = position < 3 , const double > ( d ); // error } не понимает следующее поведение:

position<3, double>(3.14).value

почему position<3, double>( 3.14 ) может быть постоянным выражением, а position<3, const double>(d)не?

Я понимаю, что компилятор хотел бы, чтобы элемент данных «позиция :: значение» был ссылкой на константу, но почему это не ссылочный тип литерала?

c++,constexpr,

2

Ответов: 1


2 принят

d

Да, такая структура является буквальным типом.

не является постоянным выражением, потому что его член valueне ссылается на разрешенный результат константного выражения , потому что референт value(т.е. d) не является ни объектом со статической продолжительностью хранения, ни функцией.

[expr.const] / 6 :

Константа является [...] или prvalue ядра константы, значение которого удовлетворяет следующие условия:

  • если значение является объектом типа класса, каждый нестатический элемент данных ссылочного типа относится к объекту, который является допустимым результатом постоянного выражения,
  • [...]

Сущность является допустимым результатом постоянного выражения, если это объект со статической продолжительностью хранения [...], или это функция.

C ++, constexpr,
Похожие вопросы
Яндекс.Метрика