Tôi có đoạn mã sau:Lỗi biên dịch mẫu - chuẩn hay không?
template<int k>
void foo()
{
}
int main(int argc, char* argv[])
{
int k = 1000;
foo<k>();
return 0;
}
mà không biên dịch, nhưng nếu tôi tuyên bố k
như const
, nó:
template<int k>
void foo()
{
}
int main(int argc, char* argv[])
{
const int k = 1000;
foo<k>();
return 0;
}
Bây giờ, tôi thấy logic đằng sau lý do tại sao trong lần đầu tiên trường hợp nó không biên dịch và trong trường hợp thứ hai, nhưng điều này có được quy định bởi tiêu chuẩn không?
Các lỗi tôi nhận được là:
Error 1 error C2971: 'foo' : template parameter 'k' : 'k' : a local variable cannot be used as a non-type argument
mà không phải là chính xác rõ ràng, kể từ k
là một biến địa phương cũng trong trường hợp đó là const
... phải không?
Bạn không xác định lý do tại sao 'k' hoạt động trong một nhưng không phải là khác, đó là phần thịt của câu hỏi. – GManNickG
Xem phần tôi đã in đậm. Tiêu chuẩn nói rằng biểu thức phải không đổi. –
Nhưng tôi tự nhắc lại: bạn không giải thích tại sao 'k' có thể sử dụng được hay không. – GManNickG