2016-12-26 10 views
22

の結果を控除します実装の部分でこれが正しく動作していますか?最初のスニペットでdecltypeはなぜ</p> <pre><code>struct MyStruct { auto foo() { return 1; } auto bar() { return foo(); } }; </code></pre> <p>コンパイルを行いますが、そうは次のように末尾の戻り値の型を使用した場合、クラス定義された関数

+6

はい。メンバー関数本体は、たとえインラインで定義されていても、論理的にクラス定義に従います。 –

+0

まあ、 'foo'の戻り値型で単純な' auto'の控除を使うことができるのであれば、 '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と一体である、動作しません。有効thiscore issue 643と箱を再び開く第二のスニペットに関する

は、core issue 945を参照して、クラス・タイプがまだ不完全である戻り値の型を、末尾に使用されています。 AFAICSでは、現行の文言では、最初の場合と同じ方法で(定義の正しい順序が与えられています)、それを可能にしますが、開かれた問題1890を念頭に置いてください。ベンダーは確認されるまで疑わしいものの実装を延期する。

+0

[CWG1890](http://wg21.link/cwg1890)はこの問題と関連があります。 – bogdan

+0

@bogdan私は、最初の場所でコードが不正であってはならないと感じているので、少し混乱しています。 – Columbo

+0

@bogdan CWG1890はデータ・メンバーのタイプです。質問は関数宣言に関するものです。どのように関連性がありますか?好奇心だけでなく批判でもない。 – skypjack

関連する問題

 関連する問題