在函数的参数列表中初始化的变量的范围
Scope of a variable initialized in the parameter list of a function
以下代码构建、编译和运行(C++、mingw)似乎没有任何问题。但是,我能保证在函数的参数列表中使用初始化列表构造的对象在该函数的范围内存在,即使该函数通过引用获取参数吗?
如果不是,在函数的参数列表(通过引用获取参数)中使用其初始值设定项列表创建对象时是否真的可能很危险,因为它会立即被破坏:在这种情况下,函数没有副本,但有对内存的引用,它可能会或可能不会被另一个进程重新分配?
struct S
{
S() : a(0), b(0) {}
S(int a, int b) : a(a), b(b) {}
int a;
int b;
};
void foo(const S& s)
{
std::cout << "s.a = " << s.a << std::endl;
std::cout << "s.b = " << s.b << std::endl;
}
int main()
{
foo({4,5}); // <-- What is the scope of the struct initialized here?
return 0;
}
这里 prvalue 从花括号初始化列表 {4,5}
物化创建类型 S
的临时对象,它在完整表达式的末尾被销毁。在你的情况下 foo({4,5});
.
All temporary objects are destroyed as the last step in evaluating the
full-expression that (lexically) contains the point where they were
created, and if multiple temporary objects were created, they are
destroyed in the order opposite to the order of creation. This is true
even if that evaluation ends in throwing an exception.
这意味着临时对象将在函数返回后被销毁,所以它是绝对安全的。
以下代码构建、编译和运行(C++、mingw)似乎没有任何问题。但是,我能保证在函数的参数列表中使用初始化列表构造的对象在该函数的范围内存在,即使该函数通过引用获取参数吗?
如果不是,在函数的参数列表(通过引用获取参数)中使用其初始值设定项列表创建对象时是否真的可能很危险,因为它会立即被破坏:在这种情况下,函数没有副本,但有对内存的引用,它可能会或可能不会被另一个进程重新分配?
struct S
{
S() : a(0), b(0) {}
S(int a, int b) : a(a), b(b) {}
int a;
int b;
};
void foo(const S& s)
{
std::cout << "s.a = " << s.a << std::endl;
std::cout << "s.b = " << s.b << std::endl;
}
int main()
{
foo({4,5}); // <-- What is the scope of the struct initialized here?
return 0;
}
这里 prvalue 从花括号初始化列表 {4,5}
物化创建类型 S
的临时对象,它在完整表达式的末尾被销毁。在你的情况下 foo({4,5});
.
All temporary objects are destroyed as the last step in evaluating the full-expression that (lexically) contains the point where they were created, and if multiple temporary objects were created, they are destroyed in the order opposite to the order of creation. This is true even if that evaluation ends in throwing an exception.
这意味着临时对象将在函数返回后被销毁,所以它是绝对安全的。