私はhereのコードを見ました。説明は言う:&&、範囲ベースのループとテンポラリはどのように連携しますか?
我々はまた、自動& &を使用して、フォワーディング参照として取り込むことができます。つまり、 の自動& &は、左辺値の参照の場合は&、左の場合は& rvaludの参照の場合は自動的に解決されます。次に、テンポラリマップ上の 範囲ベースのforループからの出力をキャプチャする例を示します。
値が(ので、この場合には何の減衰はありません)左辺値であると称する場合、私はauto&
にauto&&
の減衰を理解してください。私が苦労していることは、一時的な地図、ループに基づいた範囲と移動された値がどのように連動しているかを理解することです。これらのことがお互いにどのように機能するのか、そして反復されている一時的なものから移動するのはなぜ大丈夫なのか説明してください。
#include <iostream>
#include <map>
std::map<std::string, int> get_map()
{
return {
{ "hello", 1 },
{ "world", 2 },
{ "it's", 3 },
{ "me", 4 },
};
}
int main() {
for (auto&& [ k, v ] : get_map())
std::cout << "k=" << k << " v=" << v << '\n';
}
簡潔にするために、あなたはすでに[参照縮退](https://stackoverflow.com/questions/13725747/concise-explanation-of-reference-collapsing-rules-requested-1a-a-a-2)を理解しています。あれは正しいですか ? – WhozCraig
fyi:ここでは動きません。関数内のRVOが返されます。 –
@RichardCritten [C++ 1z]というタグが付けられているため、「潜在的なRVO」はありません。これは一時的なものであり、forループで必要となるまでは実現しません。 C++ 17より前では、実装定義されていましたが、ここでは必須であり、もはやRVOと全く同じものではありません。 –