C++0x の言語拡張のいくつかは、ライブラリに依存します。
たとえば、 Range-base for文は、 std::Range コンセプトに依存します。
vector<int> v; for (int i : v) { cout << i << endl; }
このfor文は、以下のように展開されます。
{ auto&& __range = v; for (auto __begin = std::Range<_RangeT>::begin(__range), __end = std::Range<_RangeT>::end(__range); __begin != __end; ++__begin ) { int i = *__begin; cout << i << endl; } }
しかし、 Range-base for文が std::Range コンセプトを必要とするということは、
int main() { int ar[3]; for (int i : ar) { // エラー! <iterator_concepts> をインクルードしてください } }
initializer_list もまた、
struct hoge { hoge(std::initializer_list<int>); // エラー! <initializer_list> をインクルードしてください }; int main() { hoge h = {1, 2, 3}; }
(これはそんなに問題ではないかな)
あとは、参照環境のみを持つラムダ式は、 std::reference_closure を継承した関数オブジェクトになるので
int main() { [&]{}; // エラー? }
C++03 では、言語機能がライブラリに依存するようなことは(ほとんど?)なかったので、 C++0x ではそのへんが賛否両論になるかもしれません。