c++ - 临时对象、函数参数和隐式转换

标签 c++

在以下场景中:

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/

相关文章:

c++ - 无法在 cpp 对象和头文件中使用 istream

c++ - 如何根据类型相关类型专门化 C++ 模板类函数?

c++ - 在 Ctrl+Z (EOF) 后恢复从 iostream::cin 读取? ("ignore"不起作用)

c++ - Qt Designer/Qt Creator/KDevelop 中的 KDE4 小部件

c++ - 请求 ‘c_str’ 中的非类成员 ‘str’

c++ - QThreadPool在qt cpp中强制停止

c++ - 断言 vector 按值 x 划分

c++ - std::set<pair<int,int>> -- 仅使用 pair<>::first 作为键查找

c++ - 最终类构造函数和析构函数中对 vtable 的 undefined reference

WSAsend 数据包的 C++ 奇怪十六进制转储