在以下场景中:
struct Foo
{
// ...
operator Bar() {... } // implicit cast to Bar
}
Foo GetFoo() { ... }
void CallMeBar(Bar x) { ... }
// ...
CallMeBar( GetFoo() );
[edit] 修复了转换运算符 d'oh[/edit]
GetFoo
返回一个 Foo 类型的临时对象。这个对象是否一直存在到 CallMe 返回之后?标准怎么说?
我理解如果 CallMe
接受 Foo,临时对象在 CallMe
返回之前不会被销毁。但是,我不确定隐式转换是否会改变这一点,并且只有临时 Bar
可以保证存活下来。
典型情况是 Foo = CString, Bar = char *,即 Bar 引用由 Foo 持有(并释放)的数据。
最佳答案
由于 C++ 标准,无论转换如何,临时对象都将在对 CallMe()
函数的调用中“存活”:
12.2.3 [...] 临时对象被销毁,作为评估包含它们创建点的完整表达式 (1.9) 的最后一步。 [...]
1.9.12 fullexpression 是不是另一个表达式的子表达式的表达式。
关于c++ - 临时对象、函数参数和隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1158084/