2013-08-02 35 views
5

Từ § 17.6.4.9 của tiêu chuẩn ISO/IEC 14882: 2011 (E) (C++ 11):Việc triển khai C++ có được phép giả định tham số hàm tham chiếu rvalue là duy nhất không?

Mỗi phòng trong số sau đây áp dụng cho tất cả các đối số cho chức năng de fi định nghĩa trong Thư viện C++ chuẩn, trừ khi rõ ràng khẳng định khác.
[snip]
- Nếu đối số hàm liên kết với tham số tham chiếu rvalue, triển khai có thể giả định tham số này là tham chiếu duy nhất cho đối số này.

Đặc điểm kỹ thuật này chỉ áp dụng cho các chức năng thư viện chuẩn, nhưng dường như toàn bộ điểm tham chiếu rvalue là cho loại giả định này là có thể. Nếu tôi có một hàm lấy tham chiếu rvalue và chuyển một tham chiếu (hoặc thông qua một tạm thời hoặc std::move), thì việc triển khai một cách hợp pháp có thể thực hiện tối ưu hóa giả định nó là duy nhất không? Nếu không, hãy thực hiện bất kỳ triển khai nào?

+3

Tôi không chắc chắn câu hỏi của bạn. Có vẻ như câu trả lời đúng trong câu trích dẫn của bạn: 'việc triển khai có thể giả định rằng tham số này là duy nhất' –

+1

Câu trả lời trả lời cho các hàm thư viện chuẩn. Nhưng còn về các hàm được định nghĩa trong chính chương trình thì sao? –

Trả lời

5

Ngôn ngữ không tự gán rằng tham chiếu rvalue không thể đặt bí danh cho bất kỳ đối tượng nào khác, đây chỉ đơn giản là điều kiện tiên quyết được nêu trong các hàm thư viện chuẩn. Vì vậy, nếu bằng cách "thực hiện" bạn có nghĩa là trình biên dịch, sau đó không - trình biên dịch sẽ không thực hiện bất kỳ tối ưu hóa dựa trên yêu cầu này, chắc chắn không phải trong mã mà bạn viết.

Nếu một trình biên dịch cụ thể có một số phần mở rộng cho phép mã truyền tải thông tin bí danh, thì điều kiện trước đó sẽ giúp các chức năng thư viện chuẩn tận dụng các phần mở rộng đó. Loại thông tin bí danh đó có thể làm cho trình biên dịch có thể thực hiện một số tối ưu hóa.

Trong mọi trường hợp, hậu quả chính của câu lệnh là việc triển khai thư viện chuẩn không cần phải hoạt động hợp lý khi đối mặt với việc đánh dấu các thông số hàm không hợp lý. Ví dụ: nếu bạn xây dựng một cặp với

std::vector<int> some_vector(100, 42); 
auto p = std::make_pair(std::move(some_vector), some_vector); 

không đảm bảo rằng p.first == p.second.

Sự vắng mặt của một yêu cầu như thế này đối với tham số tham chiếu lvalue có nghĩa là thư viện chuẩn phải làm một số điều điên rồ để đảm bảo rằng mã như vector.insert(vector.end(), vector[3]) hoạt động ngay cả khi véc-tơ phải được phân bổ lại. Tôi tưởng tượng ủy ban nghĩ rằng nó không thực tế cho việc triển khai để phát hiện răng cưa rvalue và đôi khi phải di chuyển.

+1

Oooh, tôi hiểu rồi. Các "thực hiện" trong báo giá được gọi là thực hiện _ của function_, không phải là việc thực hiện ngôn ngữ. –

+0

@DyP Tôi giả sử 'std :: make_pair()' là một ví dụ tốt về hàm không phải hàm tạo, hàm gán không định nghĩa trong thư viện chuẩn có nhiều đối số có thể tham chiếu, ít nhất một tham số có thể là một tham chiếu rvalue. 'std :: make_pair (std :: move (some_container), some_container)' ví dụ sẽ có kết quả không xác định. – Casey

+1

@DyP Assignment KHÔNG phải là một ví dụ, vì nó không thể có nhiều đối số - hãy để một mình nhiều đối số bí danh. Tôi là một thằng ngốc, cảm ơn vì lời nhắc nhở. Tốt hơn rồi? – Casey

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