相关疑难解决方法(0)

C++ 11:基于范围的for语句:"range-init"生命周期?

在最新的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是循环入口处的挂起引用.?? 这个推理是否正确?如果没有,为什么不呢?

c++ c++11

19
推荐指数
2
解决办法
1776
查看次数

范围内的临时生命周期表达式

考虑一个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)

c++ c++11

18
推荐指数
2
解决办法
1024
查看次数

标签 统计

c++ ×2

c++11 ×2