函数参数对象是临时对象吗?

use*_*522 10 c++ language-lawyer temporary-objects

[class.temporary]/7中当前的 C++ 标准草案包含短语

除函数参数对象之外的临时对象

我的印象是函数参数对象不是临时对象。然而,这个短语是最近才添加的。那么我是否错误或误解了上下文?

Bri*_*ian 5

[stmt.ranged] 中的示例说明了 CWG 的意图:

using T = std::list<int>;
const T& f1(const T& t) { return t; }
const T& f2(T t)        { return t; }
T g();

void foo() {
  for (auto e : f1(g())) {}     // OK, lifetime of return value of g() extended
  for (auto e : f2(g())) {}     // undefined behavior
}
Run Code Online (Sandbox Code Playgroud)

所以“除了函数参数对象之外”的措辞是指 的t参数f2

我认为OP是对的,这实际上不是一个临时对象;它不属于[class.temporary]/1中提到的任何类别。然而,在某些实现上,函数参数对象具有类似临时的特征,因为它可能在包含调用的完整表达式的末尾被销毁,而不是在您期望的块变量处被销毁。我认为这就是 CWG 试图在此解决的问题。