2014-11-10 19 views
9

Nhìn vào tiêu chuẩn C++ 11. Tôi có thể thấy chuyên môn của std::tuple_sizestd::tuple_element được cung cấp cho volatileconst volatile bộ dữ liệu.dễ bay hơi và const dễ bay hơi std :: tuple và std :: get

template <size_t I, class T> class tuple_element<I, volatile T>; 
template <size_t I, class T> class tuple_element<I, const volatile T>; 

template <class T> class tuple_size<volatile T>; 
template <class T> class tuple_size<const volatile T>; 

Nhưng std::get làm không phục vụ chuyên môn cho volatile hay const volatile tuple.

Tôi đã thử các mã sau đây trên GCC.4.8.1

volatile std::tuple<int, int> a(1, 1); 
std::cout << "a<0>=" << std::get<0>(a) << "\n"; 

tôi nhận được lỗi: no matching function for call to 'get(volatile std::tuple<int, int>&)'

Vì vậy, nếu tôi hiểu rằng tôi có thể tạo ra (const) tuples dễ bay hơi nhưng tôi không thể truy cập vào các yếu tố của họ .

Đây có phải là hành vi dự kiến ​​hoặc giám sát không?

Cảm ơn rất nhiều.

+0

Không hoạt động trên GCC 4.9, fwiw. – Barry

+0

'const volatile' đánh tôi như một sự kết hợp kì lạ. Bất cứ ai biết sử dụng hợp pháp của nó? – Cameron

+3

@Cameron đăng ký phần cứng không nên được ghi vào nhưng có thể được thay đổi theo bạn, ví dụ. –

Trả lời

4

Đây không chỉ là trường hợp cho std::get mà còn cho relational operators hoặc swap. Tại sao swap không hỗ trợ các bộ dữ liệu dễ bay hơi? Bởi vì không có move constructor của tuple mất các bộ dữ liệu dễ bay hơi. Tương tự với số assignment operator. Trên thực tế, khi xem xét toàn bộ thư viện chuẩn, hầu như không có lớp hoặc mẫu nào cung cấp quá tải cho các đối tượng dễ bay hơi . Có lẽ nó sẽ là một rắc rối trong tiêu chuẩn hóa và thực hiện; Hoặc có lẽ nó được coi là vô nghĩa khi có các đối tượng lớp dễ bay hơi. Trong cả hai trường hợp, các bộ dữ liệu dễ bay hơi hiện tại khá không sử dụng được và thêm một sự quá tải get cho chúng, đối với trạng thái hiện tại của giao diện, không nhất quán.

Sử dụng volatile tuple làm loại (và không phải đối tượng) không phải là vấn đề có vấn đề và có thể hữu ích. Điều đó, và thực tế là hầu như tất cả các đặc tính kiểu đơn lẻ khác trong thư viện chuẩn cũng chuyên về tất cả các vòng loại cv, dẫn đến tuple_elementtuple_size hỗ trợ nó.


Người ta có thể dễ dàng kiểm tra điều này bằng cách tìm kiếm volatile trong tiêu chuẩn C++ từ khoản 17 trên. Người ta sẽ thấy rằng không có hàm (mẫu) nào ngoài các hàm cho các nguyên tử trong điều 29 bị quá tải cho các tham số dễ bay hơi.

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