アルゴリズム内でラムダに要素を渡す、私は参照ツーのconstで要素を受け入れラムダを作成したい:参照ツーの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
};
}
コンパイラはこのコードを好きではありません:
Error: »const«-qualifier cannot be applied to »int&« (translated manually from German)
は、その後、私はdecltype(*it)
はすでに参照され、そして当然のことながら、それらがconst
行うことができないことに気づきました。 const
を削除すると、コードがコンパイルされますが、x = x
が失敗します。
私はプログラマー(私です)を1分信頼して、const
と明示的な&
を取り除きましょう。これは参照折りたたみルールのために削除されてしまいます。しかし、待って、decltype(*it)
実際は、基準となるを保証されている、または私は安全側にあることを明示的&
を追加する必要がありますか?
我々は、プログラマを信用していない場合、私は問題を解決するには、2つの解決策を考えることができます:
(const typename std::remove_reference<decltype(*it)>::type& x)
(const typename std::iterator_traits<Iterator>::value_type& x)
あなたは醜悪である1自分で決めることができます。理想的には、ターゲット・オーディエンスがこれまでにこれまで聞いたことがないので、テンプレート・メタプログラミングを含まないソリューションが必要です。だから、:
質問1:decltype(*it)&
は常にdecltype(*it)
と同じですか?
質問2:どのように私は、テンプレートメタプログラミングなしで参照ツーのconstで要素を渡すことができますか?
英語のエラーが良いでしょう! :) – Pubby
@Pubby私はベストを尽くして、修正を自由にしてください:) – fredoverflow
@seheはトップレベルのconstに関するものではありません。 –