Chú ý rằng có là đoạn mã có giá trị cả từ khóa bổ sung và không thêm, mang lại kết quả khác nhau trong từng trường hợp, ngay cả đối với các mẫu mà lấy thông số loại thay vì số nguyên.
#include <iostream>
struct A {
template<typename T>
static A f(T) {
return A();
}
template<typename T> operator T() { return T(); }
};
template<typename U>
int g() {
U u;
typedef A (*funcPtrType)(int());
return !(funcPtrType)u.f < int() > (0);
}
int main() {
std::cout << g<A>() << std::endl;
}
này kết quả đầu ra 0
khi chạy mà không có từ khóa template
thêm. Nếu bạn thêm từ khóa trước f < int() >
, từ khóa sẽ xuất ra 1
.
Giải thích
Phiên bản mà không có từ khóa phân tích như
funcPtrType temp1 = (funcPtrType)u.f; // taking func address
bool temp2 = !temp1; // temp2 == false
bool temp3 = temp2 < int(); // temp3 == false
bool temp4 = temp3 > (0); // temp4 == false
return temp4;
Và phiên bản với từ khóa phân tích như
A temp1 = u.template f < int() > (0); // function call
funcPtrType temp2 = (funcPtrType) temp1; // temp2 == 0
bool temp3 = !temp2; // temp3 == true
return temp3;
ý rằng temp2
là một con trỏ null (được sản xuất bởi return T()
). Toàn bộ các phân tích cú pháp khác nhau và cả hai đều hợp lệ! Điều này thực sự cần một cách để phân biệt - đó là chèn từ khóa template
nếu thích hợp.
Nguồn
2010-06-16 21:36:10