在最新的C++标准中,它意味着:
for (foo : bar)
baz;
Run Code Online (Sandbox Code Playgroud)
等同于:
{
auto && r = bar;
for ( auto it = r.begin(), end = r.end(); it != end; ++it )
{
foo = *it;
baz;
}
}
Run Code Online (Sandbox Code Playgroud)
当上面的bar是一个返回集合的函数调用时,例如:
vector<string> boo();
Run Code Online (Sandbox Code Playgroud)
即
for (auto bo : boo())
...
Run Code Online (Sandbox Code Playgroud)
这条线不会成为:
auto&& r = boo();
...
Run Code Online (Sandbox Code Playgroud)
因此boo()的临时返回值在语句"auto && r = boo()"的末尾被销毁,然后r是循环入口处的挂起引用.?? 这个推理是否正确?如果没有,为什么不呢?
考虑一个A可以用作范围的简单类:
struct A {
~A() { std::cout << "~A "; }
const char* begin() const {
std::cout << "A::begin ";
return s.data();
}
const char* end() const {
std::cout << "A::end ";
return s.data() + s.size();
}
std::string s;
};
Run Code Online (Sandbox Code Playgroud)
如果我A在范围内制作一个临时的,它的工作原理与我希望的完全一样:
for (auto c : A{"works"}) {
std::cout << c << ' ';
}
// output
A::begin A::end w o r k s ~A
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试包装临时:
struct wrap {
wrap(A&& a) : a(std::move(a))
{ }
const char* …Run Code Online (Sandbox Code Playgroud)