initializer_lists中的临时生命周期嵌套在函数调用

时间:2017-01-21 21:39:26

标签: c++ c++11

func({someString, std::string("foo")})之类的临时用户的生命周期是多少?我问,因为问题是initializer_list 实际上是initializer_list<Foo>类型(不是initializer_list<string>),和 Foo的ctor将其参数的地址存储为指针。会这样吗 创建initializer_list之后,但是之前会破坏临时性 函数调用?或者临时工将永远活着 函数调用?

下面提供了一些示例代码,以及运行产生的输出 clang ++ 8.0.0的代码。临时演员似乎活了一段时间 函数调用我的特定系统,但这是行为标准, 它会在不同的编译器中保持一致吗?

#include <stdio.h>
#include <vector>
#include <string>
#include <initializer_list>

using namespace std;

class Foo
{
public:
    const string* x;

    Foo(const string& str) : x(&str) {
        printf("Foo::Foo()\n");
    }

    ~Foo() {
        printf("Foo::~Foo()\n");
    }
};

void
funcA(initializer_list<Foo> args)
{
    (void)args;
    printf("funcA()\n");
}

void
funcB(vector<Foo> args)
{
    (void)args;
    printf("funcB()\n");
}

void
funcC(const vector<Foo>& args)
{
    (void)args;
    printf("funcC()\n");
}

int
main()
{
    string a;

    printf("=========\n");
    funcA({a, string("foo")});
    printf("=========\n");
    funcB({a, string("bar")});
    printf("=========\n");
    funcC({a, string("baz")});
    printf("=========\n");

    return 0;
}

示例输出:

=========
Foo::Foo()
Foo::Foo()
funcA()
Foo::~Foo()
Foo::~Foo()
=========
Foo::Foo()
Foo::Foo()
funcB()
Foo::~Foo()
Foo::~Foo()
Foo::~Foo()
Foo::~Foo()
=========
Foo::Foo()
Foo::Foo()
funcC()
Foo::~Foo()
Foo::~Foo()
Foo::~Foo()
Foo::~Foo()
=========

1 个答案:

答案 0 :(得分:1)

临时对象的生命周期一直到语句结尾。它们可用于本声明中的任何函数调用,但不能超出。因此,您可以传递引用并使用临时对象。他们的地址不应该存储起来以备日后参考。