Вложенный класс с конструктором constexpr, допустимый при выводе из параметра шаблона с конструктором non-constexpr? - PullRequest
0 голосов
/ 26 апреля 2018
template<typename T>
struct Outer
{   struct Inner : T
    {   constexpr Inner() {}
    }
    m;
};

struct NonConstexpr
{   NonConstexpr() {}
};

int main() { Outer<NonConstexpr> o; }

В Visual C ++ (2015 и 2017) это приводит к error C3615: constexpr function 'Outer<NonConstexpr>::Inner::Inner' cannot result in a constant expression

И G ++, и Clang принимают код. Это ошибка в компиляторе Microsoft?

Проводник компилятора: https://godbolt.org/g/SfZfMh

Edit: Чтобы уточнить, это работает, если мы сделаем Inner шаблон. Но это становится немного уродливым.

template<typename T>
struct Outer
{   template<typename T_>
    struct Inner : T_
    {   constexpr Inner() {}
    };
    Inner<T> m;
};

1 Ответ

0 голосов
/ 27 апреля 2018

[dcl.constexpr] / 4

Определение конструктора constexpr должно удовлетворять следующим требованиям: ... либо его тело-функции должно быть = delete, либо оно должно удовлетворять следующим требованиям ... для не делегирующего конструктор, каждый конструктор выбран для инициализации нестатических членов данных и подобъекты базового класса должны быть конструктором constexpr.

Поскольку NonConstexpr::NonConstExpr() не constexpr, конструктор производного класса Outer<NonConstexpr>::Inner::Inner(), который его вызывает, также не может быть constexpr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...