Khi trả lời this SO question, tôi tìm thấy trong tiêu chuẩn (đã có C++ 03, vẫn còn trong C++ 11) mà bạn chỉ có thể sử dụng địa chỉ làm đối số mẫu không biểu mẫu & id-expression
(cộng với một số ngoại lệ).con trỏ làm đối số mẫu không phải kiểu
Nhưng tôi không thể trả lời lý do tại sao trường hợp này xảy ra.
luận14.3.2 Mẫu phi loại [temp.arg.nontype]
Mẫu đối số cho một tổ chức phi loại, phi mẫu template-tham số sẽ là một trong:
[...]
- biểu thức liên tục (5.19) chỉ định địa chỉ của đối tượng có lưu trữ tĩnh> thời lượng và liên kết bên ngoài hoặc bên trong hoặc chức năng có liên kết bên ngoài hoặc bên trong, bao gồm mẫu chức năng và mẫu chức năng -trên nhưng exc luding thành viên lớp không tĩnh, thể hiện (bỏ qua dấu ngoặc đơn) như & id-expression, ngoại trừ & có thể bỏ qua nếu tên đề cập đến hàm hoặc mảng và sẽ bị bỏ qua nếu tham số mẫu tương ứng là tham chiếu; [...]
(n3485, tôi nhấn mạnh)
Ví dụ:
using TFoobar = int (*)();
template < TFoobar tp > struct foo_struct{};
int foobar() { return 42; }
constexpr TFoobar pFoobar = &foobar;
foo_struct < &foobar > o0; // fine
foo_struct <pFoobar> o1; // ill-formed
Tôi đoán nó có cái gì để làm với các giai đoạn dịch thuật, cụ thể là trình biên dịch không biết nhiều về địa chỉ. Tuy nhiên, tại sao nó không được phép? Không nên nó có thể cho trình biên dịch sử dụng một cái gì đó tương tự như thay thế vĩ mô để thay thế pFoobar
với &foobar
?
Câu hỏi hay. –
Tôi đoán đó là vấn đề làm thay đổi bảo thủ.C++ 11 có đầy đủ các cách thực sự nghiêm ngặt đối với ngôn ngữ để thực hiện mọi thứ để làm cho mọi thứ dễ dàng hơn cho các trình biên dịch trình biên dịch. Nó có thể được mở rộng C++ 11 để cho phép ở trên, nhưng đó là một vấn đề cho C + + 14 hoặc hơn thế nữa! – Yakk
[Có đề xuất] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4268.html) để xóa những hạn chế này. – dyp