【发布时间】:2017-01-21 21:39:25
【问题描述】:
像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()
=========
【问题讨论】: