2011-12-14 30 views
51

Người dùng được phép thêm chuyên môn rõ ràng vào không gian tên std. Tuy nhiên, có một vài mẫu mà tôi bị cấm một cách rõ ràng từ chuyên.Điều gì có thể và tôi không thể chuyên về không gian tên std?

Tôi có thể chuyên môn hóa những mẫu nào?

+1

Chính xác, bạn đang tìm kiếm câu trả lời? Thực sự, nếu bạn muốn chuyên gì đó, bạn phải tham khảo thông số kỹ thuật. Hầu hết các thành phần Thư viện chuẩn áp đặt các yêu cầu về chuyên môn. Một câu trả lời hoàn chỉnh về những gì bạn có thể và không thể chuyên môn và những hạn chế về chuyên môn sẽ là quá dài đối với một câu trả lời Stack Overflow. –

+0

Bởi "chuyên chức năng", tôi giả sử bạn có nghĩa là "chuyên mẫu chức năng"? Nhân tiện, C++ 11 có cho phép chuyên môn hóa một phần chức năng không? – fredoverflow

+2

không được phép chuyên môn hoá một phần mẫu chức năng, thay vào đó hãy sử dụng chức năng nạp chồng chức năng. xem http://www.gotw.ca/publications/mill17.htm – mark

Trả lời

53

Trích dẫn lỏng lẻo từ tiêu chuẩn:

  • numeric_limits sẽ không được chuyên cho loại tiêu chuẩn phi số học (ví dụ complex<T>)

  • "[S] pecializations của shared_ptr sẽ CopyConstructible, CopyAssignable, và LessThanComparable [và] có thể chuyển đổi thành bool. "

  • "Chuyên môn của weak_ptr phải là CopyConstructible và CopyAssignable".

  • "[T] các chuyên ngành emplate [của std::hash] phải đáp ứng các yêu cầu của băm mẫu lớp".

  • Mọi thứ trong <type_traits>: "Hành vi của chương trình thêm chuyên môn cho bất kỳ mẫu lớp nào được xác định trong điều này là không xác định trừ khi được chỉ định khác". (chỉ một số chuyên môn của common_type được cho phép một cách rõ ràng)

  • Các khu vực có một số chuyên môn nhất định là yêu cầu.

  • Tất cả các chuyên môn của istreambuf_iterator sẽ có một hàm tạo bản sao nhỏ, một hàm tạo mặc định constexpr và một hàm hủy nhỏ.

  • "Hiệu ứng của việc khởi tạo mẫu lớp complex đối với bất kỳ loại nào khác ngoài float, double hoặc long double không được chỉ định." Tôi lấy nó có nghĩa là việc xác định các chuyên ngành khác là vô nghĩa.

  • "Chuyên môn và instantiations của mẫu atomic phải có một bản sao đã xóa, một toán tử gán bản sao đã xóa và một hàm tạo giá trị constexpr."

  • "Mẫu lớp unary_functionbinary_function không còn được dùng nữa. Chương trình sẽ không khai báo chuyên môn của các mẫu này".

Và dĩ nhiên mệnh đề bao quát 17.6.4.2.1, câu 1 (nhờ @sehe và @curiousguy):

Hành vi của một chương trình C++ là undefined nếu nó thêm tuyên bố hoặc định nghĩa đến không gian tên std hoặc đến một không gian tên trong không gian tên trừ khi được chỉ định khác. Chương trình có thể thêm chuyên môn mẫu cho bất kỳ mẫu thư viện chuẩn nào vào không gian tên chỉ khi khai báo phụ thuộc vào kiểu người dùng được xác định và chuyên môn đáp ứng yêu cầu thư viện chuẩn cho mẫu ban đầu và không rõ ràng là .

Và câu 2:

Hành vi của một chương trình C++ là undefined nếu nó tuyên bố

  • một chuyên môn hóa rõ ràng của bất kỳ hàm thành viên của một lớp mẫu thư viện chuẩn, hoặc

  • một chuyên môn rõ ràng về bất kỳ mẫu chức năng thành viên nào của lớp thư viện chuẩn hoặc mẫu lớp học hoặc

  • một chuyên môn rõ ràng hoặc một phần của bất kỳ mẫu lớp thành viên nào của lớp thư viện chuẩn hoặc mẫu lớp học.

Một chương trình có thể nhanh chóng một cách rõ ràng mẫu quy định tại các thư viện chuẩn chỉ khi khai phụ thuộc vào tên của một loại người dùng định nghĩa và instantiation đáp ứng các yêu cầu về tiêu chuẩn thư viện cho mẫu gốc.

+0

Tôi mong đợi các chuyên môn của 'shared_ptr',' weak_ptr' sẽ nhiều hơn CopySomething! – curiousguy

+1

"Chương trình có thể thêm chuyên môn mẫu cho bất kỳ mẫu thư viện chuẩn nào vào không gian tên' std' only (...) chuyên môn ** đáp ứng các yêu cầu thư viện chuẩn cho mẫu gốc ** " – curiousguy

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