Рассмотрим этот фрагмент кода:
#include <iostream>
struct A {
void f() { std::cout << "f"; }
void g() { std::cout << "g"; }
template <bool b>
void call() { (b ? f() : g()); }
};
int main()
{
A().call<true>();
}
В зависимости от параметра template
, переданного в call
, будет вызываться либо f
, либо g
. Мой вопрос: если компилятор каким-то образом вынужден предварительно оценить условие if. Рассмотрим другую возможную реализацию call
:
template <bool b>
void call() {
bool x = b;
(x ? f() : g());
}
. В этом случае шаблон времени компиляции сначала преобразуется в переменную времени выполнения, прежде чем будет принято решение о f
или g
. Я предполагаю, что компилятор не сможет удалить оператор if в этом случае.
Действительно, если я протестирую это поведение с помощью godbolt , похоже, именно это и произойдет.
Есть ли какая-то часть стандарта, которая определяет, какие выражения шаблона имеют для оценки во время компиляции?
(Конечно, в этом простом примере я мог бы легко напишите специализации для b == true
и b == false
, но вопрос не об этом.)