Разве структура со ссылочным элементом данных не является литеральным типом? - PullRequest
0 голосов
/ 29 июня 2018

, я не понимаю следующее поведение:

#include <memory>

template <int Index, typename Type>
struct position {
    using value_type = Type;

    template <typename TT>
    constexpr position( TT& val )
        : value{ val }
    {
    }

    static constexpr int index = Index;
    Type &               value;
};

int main()
{

    constexpr double d = 3.14;
    constexpr auto p1=position<3, const double>(d).value; // ok
    constexpr auto p2=position<3, const double>(d); // error
}

почему position<3, double>(3.14).value может быть константным выражением, а position<3, double>( 3.14 ) - нет?

Я понимаю, что компилятор хотел бы, чтобы элемент данных "position :: value" был константной ссылкой, но почему, не является ли ссылка литеральным типом?

1 Ответ

0 голосов
/ 29 июня 2018

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

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

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

[expr.const] / 6

A константное выражение - это [...] или постоянное базовое выражение константы, значение которого удовлетворяет следующим ограничениям:

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

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

...