43

この質問は以下を参照しています。

新しい ranged-for はいつ使用する必要があり、新しい cbegin/cend と組み合わせることができますか?

その質問に基づいて、cbegin()andの使用を強制するには、次のcend()ようにする必要があります。

for (auto& v: const_cast<decltype(container) const>(container))

これは、それを排除するはずだった構成の定型コードの多くです。それを行うためのよりコンパクトな方法はありますか?私の質問の理由は、暗黙的に共有されたコンテナーが、begin()それ自体を切り離す手がかりとして使用される可能性があるためです。

4

3 に答える 3

36

更新:ヘッダーstd::as_constのC++17になります。<utility>

C ++ 17より前は、組み込みの構文はありません。ただし、便利なラッパーを簡単に作成できます。

template<typename T> constexpr const T &as_const(T &t) noexcept { return t; }
for (auto &v: as_const(container))

これは具体的にではbegin() constなく呼び出しであることに注意してください。標準コンテナcbegin()の一般要件はそれを指定し、同じように動作します。cbegin()begin() const

コンテナが非定数反復を特別に処理する場合、それ自体がメンバー関数を持つことは理にかなっているかもしれません。

const Container &crange() const noexcept { return *this; }
for (auto &v: container.crange())
于 2013-03-20T09:01:10.210 に答える
14
const auto& const_container = container;

for (const auto& v: const_container ) {
于 2013-03-20T09:00:21.510 に答える