読者です 読者をやめる 読者になる 読者になる

C++0xは言語とライブラリが密接に関係する

C++

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 ではそのへんが賛否両論になるかもしれません。