Подтвердить что ты не робот

Короткое замыкание при создании шаблона?

Рассмотрим этот фрагмент кода,

template<bool b>
struct other
{
    static const bool value = !b;
};

template<bool b>
struct test
{
    static const bool value = b || other<b>::value;
};

int main()
{
      bool value = test<true>::value;   
}

Составляют ли компиляторы other<true> в ситуациях, подобных выше, когда создание экземпляров кажется совершенно ненужным? Или просто потому, что я написал синтаксис other<b>::value, компиляторы должны создавать его, независимо от того, что он ничего не делает для вычисления значения test<true>::value?

Я хотел бы услышать, а) что требуется Стандартом, и б) что фактически реализовано различными компиляторами? Соответствующие разделы из Стандарта будут оценены.

4b9b3361

Ответ 1

Согласно спецификации С++, раздел $14.7.1/4:

"Специализация шаблона класса неявно создается экземпляр, если класс тип используется в контексте, который требует полностью определенного объекта тип , или если полнота тип класса влияет на семантику программа; в частности, если выражение, тип которого является классом специализированная специализация разрешение перегрузки"

В случае, когда вы проиллюстрировали короткое замыкание, класс должен иметь полный тип, потому что вы ищете его, чтобы найти значение статического члена. Это исключает компилятор из короткого замыкания выражения.

Что касается того, что на самом деле происходит на практике, я не уверен, потому что я не вижу, как компилятор может уйти, не выполняя создание. Например, предположим, что экземпляр other<b> выглядел так:

template <bool B> struct other {
    typedef int value;
};

Здесь ваша программа будет плохо сформирована, потому что other<b>:: value - это тип, а не значение, но компилятор не смог диагностировать ошибку, фактически не создав экземпляр.