Edit: Мой вопрос: почему объявления функций-членов должны быть все правильно сформированы? Поскольку компилятор создает экземпляры методов только после их использования, зачем ему нужно правильное объявление. Рассмотрим приведенный выше пример2 как возможный вариант использования этой функции.
При неявном создании экземпляра специализации шаблона класса, компилятор должен проверять полный декларатор этого члена, потому что он должен знать основную информацию об объявлении. Такое может способствовать размеру специализации шаблона класса.
Если проверка части объявления обнаружит, что она объявляет элемент данных, значение sizeof
класса может привести к другому значению. Если бы вы объявили вместо этого указатель на функцию, это было бы так
yes (*f)(typename T::XYZ*);
Язык C ++ определен таким образом, что тип объявления известен только после анализа всего объявления.
Вы можете утверждать, что вы поместили статический сигнал туда, и, таким образом, в этом случае это не требуется для вычисления его размера. Но необходим для поиска по имени, чтобы знать, к чему относится имя hasXZY<T>::f
и что вообще было объявлено имя f . Компилятор не создает определение hasXYZ::f
, но only создает экземпляр неопределяемой части объявления, чтобы получить его тип и добавить его имя к типу класса. для поиска имени. Я полагаю, что поддержка отложенного создания экземпляров для объявления имен в конкретных случаях, когда это может сработать, еще больше усложнит реализацию компиляторов C ++ и спецификации C ++, не принося сравнимых преимуществ.
И, наконец, в вашем примере, когда вы пытаетесь вызвать его, компилятор имеет для создания экземпляра объявления, потому что ему нужно найти имя f
, а для этого нужно чтобы узнать, является ли это объявление функцией или чем-то еще. Поэтому я даже теоретически не могу понять, как ваш пример мог бы работать без создания декларации. Обратите внимание, что в любом случае они , а не будут создавать определение функции.