Xét đoạn mã sau:Hai kết quả khác nhau trên GCC 4.6 và 4.7 cho mẫu template trích
#include <iostream>
#include <vector>
#include <array>
#include <type_traits>
// Version A
template<typename T>
void f(const T& x)
{
std::cout<<"Version A"<<std::endl;
}
// Version B
template<typename... T1, template<typename...> class T>
void f(const T<T1...>& x)
{
std::cout<<"Version B"<<std::endl;
}
// Version C
template<typename T1 = double, typename TN = size_t, template<typename, TN...> class T, TN... N>
void f(const T<T1, N...>& x)
{
std::cout<<"Version C"<<std::endl;
}
// Main
int main(int argc, char* argv[])
{
f(double());
f(std::vector<double>());
f(std::array<double, 3>());
return 0;
}
GCC 4.6.2 trên Windows cho phép:
Version A
Version B
Version C
và GCC 4.7.1 trên Linux cho :
Version A
Version B
Version A
Câu hỏi đặt ra là: TẠI SAO? Đây có phải là lỗi hoặc hành vi không xác định không? Tôi có nên đăng nó lên báo cáo lỗi GCC không?
Chẳng phải đây hỏi trước ngày hôm nay? – Gorpik
Xóa '= size_t' sửa lỗi. – Pubby
@Gorpik: đó là khoảng cùng một mã, nhưng không phải cho cùng một câu hỏi/lý do. – Vincent