2014-10-09 2 views

ответ

3

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); 
+0

поэтому в приведенном выше ... это возвращаемое значение td() или td(), увиденное как «функциональный объект», который имеет тип FivE? Если первое, кажется странным, что это не то же самое значение, что и td дает (i) –

+0

@ быстрые рефлексы в 'typeid (td())', 'td()' принимается за тип. Это как если бы вы объявили 'int foo();', а затем 'typeid (foo)'. –

+0

просто для ясности вещей ... Некоторые функции перегружены параметрами, указывающими, для какого типа они используются (например, функция alg по адресу http: //en.cppreference.com/w/cpp/iterator/iterator_tags), и я предполагаю, что мы не можем предоставить тип функции (в качестве параметра), в которой вместо этого (в этом примере) будем использовать() после типа, а не просто указывать тип так что структура в этом случае будет построена по умолчанию, и этот параметр фактически будет объектом такого рода, а не просто общим типом (который не работает), который исправит? –

4

td() является int(): функция, возвращающая int не принимая параметр.

+1

Стоит отметить, что есть на самом деле неясность здесь, что стандарт разрешает в пользу 'междунар()' является типом, а не значение инициализируется 'Int '. –

+0

@ T.C. Итак, возвращаемое значение - это тип, а не построенный по умолчанию int? Или это зависит от того, является ли это rvalue или lvalue? В шаблонах я иногда вижу T(), и тогда кажется, что можно инициализировать пустые слоты в векторе с ним ... –

Смежные вопросы