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()
=========
答案 0 :(得分:1)
临时对象的生命周期一直到语句结尾。它们可用于本声明中的任何函数调用,但不能超出。因此,您可以传递引用并使用临时对象。他们的地址不应该存储起来以备日后参考。