2016-07-04 15 views
21

Tôi luôn luôn nghĩ rằng nó là tốt để có người dân địa phương const được constTránh const người dân địa phương được trả lại?

void f() { 
    const resource_ptr p = get(); 
    // ... 
} 

tuần Tuy nhiên cuối cùng tôi nhìn sinh viên mà làm việc trên C++ tập thể dục và băn khoăn về một con trỏ const được trả lại

resource_ptr f() { 
    const resource_ptr p = get(); 
    // ... 
    return p; 
} 

đây , nếu trình biên dịch không thể áp dụng NRVO (hãy tưởng tượng một số kịch bản theo đó là đúng, có lẽ trả về một trong hai con trỏ, tùy thuộc vào điều kiện), đột nhiên const trở thành một bi quan vì trình biên dịch không thể di chuyển từ p, bởi vì nó const.

Bạn nên thử và tránh const trên người dân địa phương đã trả lại hoặc có cách nào tốt hơn để giải quyết vấn đề này không?

+0

Không thể di chuyển từ 'const' anyways cục bộ thông qua quy tắc if-if? –

+0

Trong thực tế, trình biên dịch có xu hướng khá xấu khi áp dụng (N) RVO trong bất kỳ trường hợp nào nhưng tầm thường nhất, vì vậy đây là một mối quan tâm hợp lý. Một trường hợp đặc biệt là khi "biến cục bộ" của bạn thực sự là một đối số, trong đó bỏ cấm sao chép một cách đáng tiếc. –

+0

Không phải trình biên dịch có thể xác định rằng thời gian tồn tại của 'p' sẽ kết thúc và di chuyển không? – Pixelchemist

Trả lời

15

Bạn nên thử và tránh const trên người dân địa phương đã trả lại hoặc có cách nào tốt hơn để giải quyết vấn đề này không?

Có. Trên thực tế, nếu resource_ptr là loại chỉ di chuyển, bạn sẽ gặp lỗi thời gian biên dịch nếu bạn cố gắng trả lại lỗi là const.

Đây là ví dụ về lời khuyên C++ 98/03 "cố gắng và đúng" không còn áp dụng trong C++ 11 và chuyển tiếp.

+1

Có trường hợp nào mà yêu cầu bắt buộc (C++ 17) thay đổi mọi thứ ở đây không? –

+1

@MarcGlisse: Tôi vẫn đang học chính quy tắc C++ 17 mới. Nhưng sự hiểu biết hiện tại của tôi là việc cắt bỏ bắt buộc sẽ chỉ áp dụng cho trường hợp tạm thời chưa được đặt tên. Ví dụ: 'return X {};'. –

+0

@HowardHinnant sẽ là một quy tắc làm cho 'p' const cho đến khi câu lệnh' return' không tốt hơn, nếu không có tham chiếu nào khác tới 'p' sau' return' (các dtors của local được khai báo sau 'p')? Sự trở lại sẽ bỏ qua 'const'. Tôi không thích những "cạm bẫy" mà chờ đợi cho bạn mỗi dòng mã khác. –

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