Короткое замыкание при создании шаблона? - PullRequest
12 голосов
/ 05 января 2011

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

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?

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

1 Ответ

9 голосов
/ 05 января 2011

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

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

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

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

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

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

...