Почему?Разве это не должно работать?
Нет, не должно.pCondition
не является константным выражением .Я понимаю, почему это может сбивать с толку, поскольку pCondition
- это const
- но термин константное выражение относится к тому, что он может быть оценен во время компиляции.То есть не const
, а действительно constexpr
.
Параметры функции не являются константными выражениями.Тот факт, что вы случайно передали константу времени компиляции, не имеет значения, так как вы могли бы так же легко передать переменную времени выполнения, которую вы читаете из stdin или чего-то еще.
if constexpr
требует константного выражения, так что вы действительнопросто хочу if
там.Или вам нужно поднять условие, чтобы оно было константным выражением, например, сделав его параметром шаблона:
template <bool pCondition, typename T>
constexpr const T& Select(const T& a, const T& b)
{
if constexpr (pCondition) // now okay
{
return a;
}
else
{
return b;
}
}
int c = Select<qDebug>(a, b);
или вы можете потребовать, чтобы параметр был значением, закодированным в тип:
template <typename Boolean, typename T>
constexpr const T& Select(Boolean pCondition, const T&, const T&);
constexpr std::true_type qDebug{}; // true_type, not bool = true
int c = Select(qDebug, a, b); // okay