2016-06-06 22 views
8

tôi có chức năng thành viên sau đây:Khi được các nhà xây dựng bản sao cho giá trị trả về sẽ xảy ra

Person ClassB::DoSomethingAndReturnPerson() 
{ 
RAIIMutex myLock(&m_mutex); 
return m_person; 
} 

RAIIMutex là một lớp helper mà recieves một mutex và khóa nó trong các nhà xây dựng và phát hành trong destructor.

m_person thuộc loại Person (thứ gì đó rất nhỏ). Các chức năng khác trong các chủ đề khác có thể thay đổi thành viên này.

Tôi muốn trả lại m_person theo giá trị (trả lại bản sao) và dĩ nhiên tôi muốn tránh tình huống trong đó m_person bị thay đổi trong chuỗi khác trong khi nó đang được sao chép trong khi trả lại.

Nhưng điều gì xảy ra trước? Trình biên dịch đầu tiên có tạo ra một bản sao của m_person hoặc lần đầu tiên gọi hàm hủy của myLock?

Về mặt lý thuyết nó có thể giải quyết easly bằng cách làm một cái gì đó như thế này:

Person ClassB::DoSomethingAndReturnPerson() 
{ 
RAIIMutex myLock(&m_mutex); 
Person tmp = m_person; 
return tmp; 
} 

Nhưng tôi muốn biết câu trả lời cho câu hỏi của tôi.

Cảm ơn

+0

[OT] Bạn có thể thay thế 'RAIIMutex' với [' std :: lock_gurad'] (http://en.cppreference.com/w/cpp/thread/lock_guard) – NathanOliver

+1

Các nhà xây dựng bản sao có thể không được gọi ở tất cả, do [copy elision] (https://en.wikipedia.org/wiki/Copy_elision). –

+1

@JoachimPileborg Đó là nghi ngờ như 'm_person' dường như là một biến thành viên lớp. – NathanOliver

Trả lời

10

bản sao-khởi của giá trị trả về sẽ được xử lý trước đó.

Từ tiêu chuẩn, $6.6.3/3 The return statement [stmt.return] (tôi nhấn mạnh)

Bản sao-khởi của thực thể trở lại được giải mã trước khi phá hủy là tạm thời ở phần cuối của toàn biểu thành lập bởi các toán hạng của return return, trong đó, lần lượt, là được giải trình tự trước khi hủy các biến cục bộ (6.6) của khối kèm theo mệnh đề return.

+0

Cảm ơn, Tôi có thể tìm tiêu chuẩn ở đâu? Nó có sẵn miễn phí không? – OopsUser

+0

@OopsUser Bạn có thể muốn xem [Tôi tìm tài liệu chuẩn C hoặc C++ hiện tại ở đâu?] (Http://stackoverflow.com/questions/81656/where-do-i-find-the-current-c-or -c-standard-documents), hoặc [Sách hướng dẫn và sách hướng dẫn C++ Definitive] (http://stackoverflow.com/a/388282/3309790), về cơ bản, [dự thảo cuối cùng trước khi chuẩn hóa] (http: // www. open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf) là đầy đủ (và miễn phí). – songyuanyao

-1

Cấu trúc của đối tượng địa phương được gọi sau 'dòng cuối cùng của mã của bạn'. Dưới đây là một trích dẫn có liên quan từ tiêu chuẩn (3.7.3/3):

Nếu một biến với thời gian lưu trữ tự động có khởi hoặc một destructor với tác dụng phụ, nó sẽ không bị phá hủy trước khi kết thúc của mình chặn, và cũng không nó sẽ bị loại như một tối ưu hóa ngay cả khi nó dường như là không sử dụng, ngoại trừ một đối tượng lớp hoặc bản sao của nó/di chuyển có thể được loại bỏ theo quy định tại 12,8

+0

Vì vậy, nó sẽ xảy ra trước hoặc sau khi các nhà xây dựng sao chép? Các nhà xây dựng bản sao không phải là một phần của mã của tôi, trình biên dịch xử lý nó – OopsUser

+0

OopsUser, câu trả lời của @songyuanyao cung cấp cho ngay cả báo giá tốt hơn. Sau khi xây dựng bản sao, nếu nó được gọi là ở tất cả. – SergeyA

Các vấn đề liên quan