Ответ 1
Согласно спецификации С++, раздел $14.7.1/4:
"Специализация шаблона класса неявно создается экземпляр, если класс тип используется в контексте, который требует полностью определенного объекта тип , или если полнота тип класса влияет на семантику программа; в частности, если выражение, тип которого является классом специализированная специализация разрешение перегрузки"
В случае, когда вы проиллюстрировали короткое замыкание, класс должен иметь полный тип, потому что вы ищете его, чтобы найти значение статического члена. Это исключает компилятор из короткого замыкания выражения.
Что касается того, что на самом деле происходит на практике, я не уверен, потому что я не вижу, как компилятор может уйти, не выполняя создание. Например, предположим, что экземпляр other<b>
выглядел так:
template <bool B> struct other {
typedef int value;
};
Здесь ваша программа будет плохо сформирована, потому что other<b>
:: value - это тип, а не значение, но компилятор не смог диагностировать ошибку, фактически не создав экземпляр.