2016-12-26 11 views
22

Почемуdecltype вычитается результат в своем классе функции, определенная

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

компиляция, но при использовании трейлинга типа возвращаемого значения следующим образом:

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

компиляции завершается с

error: function 'foo' with deduced return type cannot be used before it is defined

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

+6

Да. Функциональные тела членов логически следуют определению класса, даже если он определен в строке. –

+0

Ну, если вы можете использовать простой 'auto' вывод на возвращаемом типе' foo', почему бы не использовать его для 'bar'? – StoryTeller

+0

Я не вижу смысла 'decltype'. Я что-то упускаю? Вы ищете 'auto & foo() {return i; } auto bar() -> decltype (auto) {return foo(); } '? – ZDF

ответ

11

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

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

+0

Мне кажется, что [CWG1890] (http://wg21.link/cwg1890) относится к этой проблеме. – bogdan

+0

@bogdan Я немного смущен, потому что чувствую, что код не должен быть плохо сформирован в первую очередь, т. Е. Если что-либо, то нынешняя формулировка более запретительна, чем должна быть. – Columbo

+0

@bogdan CWG1890 - о типах элементов данных. Речь идет о объявлении функции. Как это уместно? Просто любопытство, а не критика. – skypjack