Я собираюсь начать с конца вопроса, а затем продолжить.
Из того, что я понимаю, троичному оператору нужно вычислить два его операнда
Нет.Тернарный (что означает «сделан из трех») оператор имеет три операнда, а не два.При оценке этого оператора оцениваются два из трех операндов: условие и любой операнд, который выберет условие.
Оценка не в том, в чем заключается ваша проблема.
первый, используя троичныйоператор, не компилируется.
Я думаю, я понимаю, почему это так.Вы присваиваете результат условного оператора для std::size_t
.Для того, чтобы это скомпилировалось, тип этого результата должен быть std::size_t
или быть конвертируемым в этот тип.Таким образом, компилятор должен определить тип результата.Я нашел правила определения типа .Первое правило применяется, если второй или третий операнды имеют тип void
.Таким образом, даже если один из этих операндов не будет оценен, оба их типа должны быть известны.
ОК, так каков тип вашего третьего операнда, который не будетоценивать?Ну, это 1 + index_of<int>
, поэтому нам лучше проверить объявление index_of<int>
.Нам нужны два параметра.Сообщение об ошибке Cue.
Это, вероятно, что-то, с чем вам придется иметь дело в любом случае, так как вы должны получить одинаковую ошибку для любого подхода в случае "not found" (например: index_of<unsigned, int, long, float>
).Как вы, возможно, заметили, сообщение об ошибке по умолчанию не дает хороших результатов, описывая, что пошло не так, поэтому, вероятно, хорошей идеей для вашего шаблона является конкретное рассмотрение этого случая, даже если обращение к этому случаю просто означает предоставление более понятной ошибки компилятора.