たとえば、前方宣言と代替関数構文に関するウィキペディアのセクションから:
Ret 型は、Lhs 型と Rhs 型の追加によって生成されるものです。[...] decltype を使用しても、これは不可能です。
template<class Lhs, class Rhs> decltype(lhs+rhs) //Not legal C++11 adding_func(const Lhs &lhs, const Rhs &rhs) { return lhs + rhs; }
lhs と rhs がまだ定義されていないため、これは正当な C++ ではありません。パーサーが残りの関数プロトタイプを解析するまで、それらは有効な識別子にはなりません。
システムが大きなメモリ プレッシャーにさらされていたとき、これは理解できました (これにより、パスをストリーミング操作として実行できました)。しかし、なぜこの時代 (私のスマートフォンには、完全なソース コード、完全な解析ツリー、そして適切なファイル用のいくつかを保持するのに十分な RAM がある) で、トークンの順序が重要になるのでしょうか? decltype
たとえば、その中の識別子がタイプまたは変数であるかどうかを知らない限り、非端末生成の終わりを見つけることが不可能になる文法の奇妙なコーナーケースはありますか? もう 1 つのポイントとして、グローバル/名前空間スコープの宣言の順序がまったく問題になるのはなぜですか?
編集、これは合法であることがわかりました:
class foo {};
foo Foober(int foo) { return ::foo(); }
私が実際にこれに遭遇した場合、それは The Daily WTF に掲載されることになりますが、それでも合法です。