2015-06-24 24 views
5

Mục 13 từ "C++ hiện đại hiệu quả" của Scott Mayers cho biết các trình tối ưu hóa trên các trình lặp. Tôi đồng ý nhưng tôi cũng muốn sử dụng các chức năng không phải là thành viên thay vì các chức năng của thành viên. Theo sách phải có chức năng không phải là thành viên std::cbegin()std::cend() trong C++ 14.Hỗ trợ `std :: cbegin()` trong C++ 14

Để sử dụng các chức năng này, tôi vừa cài đặt phiên bản gcc 4.9.2 và được biên dịch với cờ -std=c++14. Dường như nó biên dịch cho đến khi tôi cố gắng sử dụng std::cbegin(). Tôi bắt đầu tìm kiếm sự hỗ trợ cho chức năng này nhưng không thể tìm thấy bất cứ điều gì về nó. Ví dụ: tại gnu onlinedocs status chức năng thậm chí không được đề cập.

Câu hỏi của tôi là, sẽ std::cbegin()std::cend() thực sự được hỗ trợ trong C++ 14 hoặc đây là một sai lầm trong cuốn sách? Nếu nó sẽ là một tính năng C++ 14, có trình biên dịch đã hỗ trợ các chức năng này và khi nào gcc sẽ hỗ trợ nó?

Có nhiều câu hỏi tại SO khoảng begin() nhưng những câu hỏi này là về các hàm thành viên hoặc về constexpr-ness chứ không phải về sự hỗ trợ của biến thể không phải thành viên.

Trả lời

1

Hỗ trợ của GCC 4.9 cho C++ 14 là thử nghiệm và không đầy đủ. Nhưng here, bạn có thể thấy rằng

chức năng toàn cầu cbegin, cend, rbegin, Rend, crbegin, và crend ​​để truy cập nhiều để container, mảng và danh sách khởi tạo.

được thêm vào GCC 5.1.

2

Có, chúng nằm trong C++ 14. Chúng được thêm vào bởi một library issue, không phải bởi một bài báo, và có vẻ như trang hướng dẫn sử dụng libstdC++ không theo dõi các vấn đề thư viện.

Chúng được triển khai trong GCC 5.1. Xem GCC bug 64656.

+0

Đó là đề xuất của tôi. Chỉ có tôi không tự viết nó vì nó nên được viết thay cho tôi bởi một số thành viên của Ủy ban. :) –

1

Đúng vậy, cppreference mô tả chúng dọc theo begin/end.

Và tiêu chuẩn xác định nó trong phần 24.7 - Range access. Tôi không trích dẫn nó bởi vì nó là một loạt các định nghĩa hàm mẫu mà đồng ý với các liên kết ở trên.

Dự thảo, mà phải là rất gần với phiên bản cuối cùng (Tôi không thể nhớ số cho dự thảo cuối cùng, xin lỗi): http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf

Như một vấn đề của thực tế, bạn có thể chơi với các ví dụ nhúng trên cppreference và thay đổi số beginend gọi tới cbegin/cend và cố gắng chạy chúng. gcc 4.9 than phiền, mặc dù gcc 5.1 đã hoạt động, cũng như clang 3.6. Vì vậy, nó chỉ là vấn đề hỗ trợ trình biên dịch.

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