この質問は次のことを指します:
新しい ranged-for はいつ使用すればよいですか? また、新しい cbegin/cend と組み合わせることはできますか?
cbegin()
この質問に基づいて、との使用を強制するにはcend()
、たとえば次のようにする必要があります。
for (auto& v: const_cast<decltype(container) const>(container))
これは、それを排除するはずの構造体の定型コードが多すぎます。もっとコンパクトな方法はありますか? 質問の理由は、暗黙的に共有されたコンテナーが、 の使用を手がかりにして、コンテナーbegin()
自体を切り離す可能性があるからです。
ベストアンサー1
アップデート: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 反復を特別に扱う場合、コンテナ自体にメンバー関数を持たせることが合理的です。
const Container &crange() const noexcept { return *this; }
for (auto &v: container.crange())