C++ 什么';临时对象的生存期在的范围内是多少?

C++ 什么';临时对象的生存期在的范围内是多少?,c++,c++11,for-loop,temporary-objects,C++,C++11,For Loop,Temporary Objects,以这一类为例: class Foo { public: ~ Foo () { std::cout << "~Foo\n"; } typedef std::vector<std::string> Words; const Words & words () { return m_words; } private: Words m_words = {"foo", "

以这一类为例:

class Foo
{
public:

    ~ Foo ()
    {
        std::cout << "~Foo\n";
    }

    typedef std::vector<std::string> Words;

    const Words & words ()
    {
        return m_words;
    }

private:

    Words m_words = {"foo", "bar", "baz"};
};

这个标准把我弄糊涂了。为什么要在循环运行之前调用
~Foo

当前标准在中说明了基于范围的语句[stmt.range]

基于范围的for语句
for(init语句选择范围声明:用于范围初始值设定项)
statement
相当于

{
    init-statementopt
    auto &&__range = for-range-initializer ;
    auto __begin = begin-expr ;
    auto __end = end-expr ;
    for ( ; __begin != __end; ++__begin ) {
      for-range-declaration = *__begin;
      statement
    }
}
这意味着您的
Foo().words()
仅用于赋值
auto&&uu range=Foo().words()并且临时对象在代码到达for循环之前不会存在


请注意,我是从。在C++11中,代码有点不同,但相关部分是相同的。

我认为答案在于定义的方式以及
\u range
所绑定的内容

-有三种情况下,临时词语在不同于完整表达结束时被销毁

  • 第三个上下文是将引用绑定到临时对象时。引用绑定到的临时对象或作为引用绑定到的子对象的完整对象的临时对象在引用的生存期内持续存在
如果将
for loop
表达式更改为直接绑定到子对象
m_words
(假设它是公共的),则
Foo()
的生存期将延长,并且以下操作将起作用

for (auto w : Foo ().m_words)
    std::cout << w << "\n";
for(自动w:Foo().m_单词)
标准::cout
{
    init-statementopt
    auto &&__range = for-range-initializer ;
    auto __begin = begin-expr ;
    auto __end = end-expr ;
    for ( ; __begin != __end; ++__begin ) {
      for-range-declaration = *__begin;
      statement
    }
}
for (auto w : Foo ().m_words)
    std::cout << w << "\n";