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

Decltype вычитает результат встроенной функции

Почему

struct MyStruct {
   auto foo () { return 1; }
   auto bar () { return foo(); }
};

но при использовании возвращаемого возвращаемого типа типа:

struct MyStruct {
   auto foo () { return 1; }
   auto bar () -> decltype(foo()) { return foo(); }
};

сбой компиляции с

error: функция 'foo' с выведенным типом возвращаемого значения не может использоваться до его определения

Это правильное поведение в части реализации?

4b9b3361

Ответ 1

В первом фрагменте мы можем выводить (эффективный) тип возврата, потому что определение предоставляется в этой лексической точке — и наоборот не будет работать, если определения лексически меняются, что находится в унисон с [dcl.spec.auto]/10, так как мы должны запретить циклический вычет.

Что касается второго фрагмента, см. основная проблема 945, которая эффективно открылась основная проблема 643 и имеет дело с this, используемым в концевых типах возврата, в которых тип класса еще неполный. AFAICS, текущая формулировка допускает его так же, как в первом случае (опять же, учитывая правильный порядок определений), но сохраняйте открытую проблему 1890 в виду; поставщики откладывают выполнение сомнительных материалов до подтверждения.