Как я могу определить, что конструктор действительно является constexpr, чтобы я мог использовать статическую инициализацию? - PullRequest
0 голосов
/ 05 декабря 2018

Посмотрите на этот код:

struct NonConstexpr {
    NonConstexpr() { }
};

template <typename T>
struct Bar {
    NonConstexpr nonConstexpr;

    constexpr Bar() { }
};

struct Foo {
    Bar<void> bar;

    constexpr Foo() { }
};

В этом коде конструктор Foo помечен как constexpr, но он не может появляться в константном выражении, так как фактически не удовлетворяетТребования этого.Вы можете прочитать подробности об этом в моем предыдущем вопросе .

Мой вопрос таков: могу ли я как-то обнаружить во время компиляции, что конструктор Foo на самом деле не будет вести себя как constexpr?

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

Обратите внимание, что простое решение временно добавить constexpr в переменную не работает, так как мой Foo имеет нетривиальный деструктор.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Если вы используете Clang, используйте [[clang::require_constant_initialization]] для переменной.Иначе я не знаю пути.

Комитет рассматривает стандартизацию этого ключевого слова.

0 голосов
/ 05 декабря 2018

Единственный (текущий, независимый от инструментальной цепочки) способ предотвратить молчащий компилятор, который мне известен, - назначить constexpr:

struct NonConstexpr {
    NonConstexpr() { }
};

template <typename T>
struct Bar {
    NonConstexpr nonConstexpr;

    constexpr Bar() { }
};

struct Foo {
    Bar<void> bar;

    constexpr Foo() { }
};

int main()
{
    constexpr auto f = Foo();
    return 0;
}

... не удастсякомпилировать с constexpr constructor calls non-constexpr function "Bar<T>::Bar() [with T=void]"

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