Oop*_*sss 3 c++ undefined-behavior
对于以下 C++ 代码:
#include <iostream>
using namespace std;
class A {
public:
A() { cout << "A()\n"; }
~A() { cout << "~A()\n"; }
A* get() { return this; } // <------
};
void f(const A * const &a, const A * const &b) {
cout << "f()\n";
}
int main() {
// f(&A(), &A()); // error: taking address of temporary
f(A().get(), A().get()); // <------
cout << "end\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它返回:
A()
A()
f()
~A()
~A()
end
Run Code Online (Sandbox Code Playgroud)
当然我不能&A()在这里使用,因为这会导致错误:error: taking address of temporary。
但当我把它包裹起来时它就起作用了A* get() { return this; }。
所以我的问题是,它是一个未定义的行为吗get()?
所以我的问题是,使用 get() 是否是未定义的行为?
不,这不是未定义的行为。它是有效的,因为首先构造临时对象,然后调用函数,然后(仅在函数返回后)再次销毁临时对象。因此,在函数调用的生命周期内,您可以对传入的临时对象执行通常可以执行的任何操作,包括取消引用指向该对象或其内容的指针。(不过,您的函数不应该存储传入的指针以供以后使用,因为一旦函数返回,它就会变成悬空指针!)