2012-03-13 28 views

Trả lời

22

số

§14.1 [temp.param] p5

[...] Các cấp cao nhất cv-vòng loại trên mẫu tham số được bỏ qua khi xác định loại của nó.

+0

Đó có phải là kiểu tham số 'typename' không? (Xem câu trả lời của tôi). Tôi không có quyền truy cập vào tiêu chuẩn và tôi khá tệ khi tìm kiếm thông tin hữu ích trong bản nháp mà tôi có. –

+2

@ J.N .: Không, trích dẫn này đề cập cụ thể đến các tham số mẫu không phải kiểu (bạn không thể có một 'const typename' anyways: P). – Xeo

+1

+1 để nhận được nhiều phiếu bầu hơn câu trả lời được chấp nhận. – ApprenticeHacker

5

Tôi thấy điều này làm một tìm kiếm nhanh của tiêu chuẩn:

template<const short cs> class B { }; 
template<short s> void g(B<s>); 
void k2() { 
    B<1> b; 
    g(b); // OK: cv-qualifiers are ignored on template parameter types 
} 

Các bình luận nói rằng họ sẽ được bỏ qua.

Tôi khuyên bạn không nên sử dụng const trong thông số mẫu vì không cần thiết. Lưu ý rằng nó không được ngụ ý - hoặc là các biểu thức hằng số khác với const.

+0

Nhận xét không bản quy phạm. –

2

Sự lựa chọn của int có lẽ là một ý tưởng tồi, nó làm cho một sự khác biệt cho con trỏ mặc dù:

class A 
{ 
public: 
    int Counter; 
}; 

A a; 


template <A* a> 
struct Coin 
{ 
    static void DoStuff() 
    { 
     ++a->Counter; // won't compile if using const A* !! 
    } 
}; 

Coin<&a>::DoStuff(); 
cout << a.Counter << endl; 
+0

Funnily đủ tiêu chuẩn dường như không đồng ý với trình biên dịch của tôi (GCC 4.6.1/ubuntu) nếu tôi tin rằng câu trả lời của người khác:/ –

+0

Đừng lo, tôi có thể hiểu sai tiêu chuẩn. Và câu trả lời của @ Pubby chỉ cho biết rằng nó bị bỏ qua khi phù hợp với các mẫu. – Xeo

+6

'const A *' không phải là 'const' phiên bản đủ điều kiện của' A * '. Nó là một loại không liên quan. 'A * const' là' const' phiên bản đủ điều kiện của 'A *'. –

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