返回值的复制构造函数何时发生
When is the copy constructor for the return value happens
我有以下成员函数:
Person ClassB::DoSomethingAndReturnPerson()
{
RAIIMutex myLock(&m_mutex);
return m_person;
}
RAIIMutex
是一个帮助程序类,它接收互斥锁并将其锁定在构造函数中,并在析构函数中释放。
m_person
属于Person
型(尺寸非常小的东西)。其他线程中的其他函数可能会更改此成员。
我想按值返回m_person
(返回副本),当然我想避免在返回中复制m_person
在另一个线程中更改的情况,因此我添加了锁。
但是首先会发生什么?编译器是首先创建m_person
的副本还是首先调用myLock
的析构函数?
从理论上讲,通过做这样的事情很容易解决:
Person ClassB::DoSomethingAndReturnPerson()
{
RAIIMutex myLock(&m_mutex);
Person tmp = m_person;
return tmp;
}
但我有兴趣知道我问题的答案。
谢谢
返回值的复制初始化将在之前处理。
从标准来看,[stmt.return]/3(强调我的)
调用结果的复制初始化在之前排序 在完整表达结束时对临时者的破坏 由 return 语句的操作数建立,而 return 语句又是 在局部变量 ([stmt.jump]) 的破坏之前排序 包含 return 语句的块。
本地对象的析构函数在"代码的最后一行"之后调用。以下是标准(3.7.3/3)的相关引用:
如果具有自动存储持续时间的变量具有初始化或 有副作用的析构函数,在结束前不得销毁 的块,也不应将其作为优化消除,即使它 似乎未使用,除了类对象或其复制/移动可能 按照 12.8 中的规定消除
相关文章:
- 何时应在构造函数参数中使用 const C++?
- 何时允许编译器优化复制构造函数
- 我应该将哪种有效负载类型发送给webrtc::P ayloadRouter的构造函数?
- 何时调用全局对象的构造函数?
- 何时在构造函数中使用 {} ()
- 何时应删除默认的移动构造函数时令人困惑的事情
- 返回值的复制构造函数何时发生
- 何时使用复制构造函数
- 移动构造函数何时会被调用
- C++类组合 - 何时执行构造函数和析构函数
- 使用构造函数时何时必须使用"this C++?
- 何时构造函数调用中的堆栈对象
- 何时提供用户定义的复制构造函数和赋值运算符
- 在构造函数的初始化列表中初始化时,何时构造成员对象?
- 运算符在C++中何时调用'new'构造函数
- 编译器何时将默认生成的构造函数标记为 noexcept
- 编译器何时不会创建默认构造函数
- 何时调用构造函数和运算符函数
- 何时调用构造函数以及如何不调用它们
- 如何以及何时使用构造函数模板