アルゴリズム内で、const への参照によって要素を受け入れるラムダを作成したいと考えています。
template<typename Iterator>
void solve_world_hunger(Iterator it)
{
auto lambda = [](const decltype(*it)& x){
auto y = x; // this should work
x = x; // this should fail
};
}
コンパイラは次のコードを好みません。
エラー: »const«-qualifier は »int&« に適用できません (ドイツ語から手動で翻訳)
それから私はそれがすでに参照されていることに気づきました、そしてdecltype(*it)
もちろんそれらは作ることができませんconst
. を削除すると、コードはコンパイルされますが、失敗しconst
たいと思います。x = x
プログラマー (私です) をしばらく信頼して、とにかく、参照の崩壊規則のために削除されるconst
明示的な とを取り除きましょう。&
しかし、待ってください、decltype(*it)
実際には参照であることが保証さ&
れていますか、それとも安全のために明示的に追加する必要がありますか?
プログラマーを信用できない場合、問題を解決するための 2 つの解決策を考えることができます。
(const typename std::remove_reference<decltype(*it)>::type& x)
(const typename std::iterator_traits<Iterator>::value_type& x)
どちらが醜いかは自分で決めることができます。理想的には、テンプレートのメタプログラミングを一切含まないソリューションが必要です。なぜなら、私の対象読者はそれを聞いたことがないからです。そう:
質問 1: はdecltype(*it)&
常に と同じdecltype(*it)
ですか?
質問 2: テンプレートのメタプログラミングなしで const への参照によって要素を渡すにはどうすればよいですか?