Может ли условный оператор (?:) В C ++ быть временем компиляции? - PullRequest
4 голосов
/ 29 января 2020

Можно ли использовать троичный (условный) оператор в качестве аналога constexpr if(), введенного в C ++ 17?

Я хотел бы добавить некоторые условия для инициализации переменных-членов в шаблоне. Будет ли следующее выражение разрешаться во время компиляции или во время выполнения? Если да, есть ли другой оператор, который разрешает во время компиляции, чтобы можно было избежать специализации шаблона?

template<int a>
struct hello {
    const static int n = (a != 0) ? 10 : 20;
}

Ответы [ 2 ]

6 голосов
/ 29 января 2020

Это зависит от того, что вы подразумеваете под "аналогом constexpr if()". if constexpr требует , чтобы условие было константным выражением. У него также есть определенные привилегии в коде шаблона для отбрасывания ветвей, которые не были приняты.

?: не имеет такой функциональности.

Однако ?: может отображаться в константных выражениях просто отлично, и это всегда мог. Это не делает выражение непостоянным.

2 голосов
/ 29 января 2020

Да, он абсолютно может и фактически может уже использоваться в C ++ 11 до введения if constexpr и даже до C ++ 11 в константных выражениях, таких как в вашем вопросе.

...