Nó phải là một biểu thức không thể thiếu. Đó là giải thích bằng văn bản tiêu chuẩn tại 5.19
:
Một liên tục thể hiện không thể thiếu có thể liên quan đến chỉ literals (2.13), điều tra viên, các biến const hay các thành viên dữ liệu tĩnh của loại tách rời hoặc đếm khởi tạo với các biểu thức hằng số (8,5), không tham số mẫu kiểu của các loại tích phân hoặc kiểu liệt kê và biểu thức sizeof. Chữ nổi (2.13.3) chỉ có thể xuất hiện nếu chúng được đúc thành các kiểu tách rời hoặc liệt kê. Chỉ có thể sử dụng loại chuyển đổi cho các loại tích phân hoặc kiểu liệt kê.
Lưu ý rằng "tích phân" là một thuật ngữ khác cho "số nguyên", nhưng không giống như "int". Ví dụ, char có kiểu số nguyên/tích phân, nhưng không phải là kiểu int. Vì vậy, cụ thể, sau đây được phép
10 or 10L or anything like that
enum { THIS, OR, THAT };
int const this_one = 10;
sizeof(char)
- tất nhiên, bất kỳ thông số mẫu khác như chi tiết ở trên
Bất kỳ của những người có thể được sử dụng làm đối số mẫu cho tham số có loại tích phân thứ e loại tương ứng. Tuy nhiên, một số chuyển đổi vẫn được áp dụng. Vì vậy, nếu nó muốn một int và bạn vượt qua một char, nó sẽ tự động thúc đẩy char đến int. Tương tự nếu bạn cung cấp một điều tra viên và nó muốn một int.
Vì vậy, bằng những quy tắc này, nếu bạn có
extern const int SomeName;
Và nó không nhìn thấy một định nghĩa mà khởi rằng thường xuyên với một biểu thức hằng số tích phân, nó không thể được sử dụng như một mẫu đối số. Nhưng nó có thể được sử dụng như một đối số hàm, tất nhiên. Những người không cần phải được biết tại thời gian biên dịch bởi vì những người không phải là một phần của một loại. Thời điểm bạn đặt tên cho một mẫu chuyên môn, các đối số bạn đã sử dụng trở thành một phần của các loại:
MyGreatStack<int, 4> // 4 is now part of the type MyGreatStack<int, 4>!
Lưu ý rằng có là cách khác để vượt qua SomeName
như một cuộc tranh cãi. Tuy nhiên, tất cả đều có thể không được chấp nhận bởi tham số mẫu nguyên. Bạn có thể chấp nhận thông số tham chiếu ở trên, ví dụ:
template<const int& V> struct NowItWorks { };
Và nó sẽ chấp nhận SomeName
ở trên. Bây giờ, thay vì một giá trị, một vị trí cụ thể duy nhất trên toàn bộ chương trình (vì biến có liên kết extern
) đã được chọn.