当我尝试传递临时地址作为参数时,它是一个 UB 吗?

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()

Jer*_*ner 5

所以我的问题是,使用 get() 是否是未定义的行为?

不,这不是未定义的行为。它是有效的,因为首先构造临时对象,然后调用函数,然后(仅在函数返回后)再次销毁临时对象。因此,在函数调用的生命周期内,您可以对传入的临时对象执行通常可以执行的任何操作,包括取消引用指向该对象或其内容的指针。(不过,您的函数不应该存储传入的指针以供以后使用,因为一旦函数返回,它就会变成悬空指针!)

  • 我自己也想知道。我认为他们本可以允许这样做,但他们可能认为程序员故意想要这样做的实例数量足够小,因此最好将其设为错误,以便程序员错误地执行此操作的实例可以在编译时捕获。 (4认同)