td()
может быть одна из двух вещей, в соответствии с грамматикой:
- Это может быть типа идентификатор, называя тип «функция не принимая параметр и возвращает
td
»
- Это может быть выражение , что означает инициализированное значение
td
.
typeid
оператор может быть использован как с типа идентификатором и выражения. Эта неоднозначность разрешается стандартом в пользу того, что это типа ID (§8.2 [dcl.ambig.res]/р2):
Неоднозначность, возникающая из-за сходства между функцией стиля cast и a Тип-идентификатор может происходить в разных контекстах. Неопределенность представляется как выбор между выражением выражения в стиле функции и объявлением типа . Разрешение состоит в том, что любая конструкция, которая могла бы быть , возможно, тип-идентификатор в его синтаксическом контексте считается идентификатор типа.
В контекстах, где типа ID не допускается, td()
будет инициализирован значением td
объекта. Например:
void foo(int i = int());
эквивалентно
void foo(int i = 0);
поэтому в приведенном выше ... это возвращаемое значение td() или td(), увиденное как «функциональный объект», который имеет тип FivE? Если первое, кажется странным, что это не то же самое значение, что и td дает (i) –
@ быстрые рефлексы в 'typeid (td())', 'td()' принимается за тип. Это как если бы вы объявили 'int foo();', а затем 'typeid (foo)'. –
просто для ясности вещей ... Некоторые функции перегружены параметрами, указывающими, для какого типа они используются (например, функция alg по адресу http: //en.cppreference.com/w/cpp/iterator/iterator_tags), и я предполагаю, что мы не можем предоставить тип функции (в качестве параметра), в которой вместо этого (в этом примере) будем использовать() после типа, а не просто указывать тип так что структура в этом случае будет построена по умолчанию, и этот параметр фактически будет объектом такого рода, а не просто общим типом (который не работает), который исправит? –