2017-10-04 18 views
9

Với tham chiếu đến đoạn mã sauphần mẫu chuyên môn với mismatching 'int` và' size_t` không biên dịch

#include <utility> 
#include <cassert> 

template <typename T> 
struct Wot; 
template <int... ints> 
struct Wot<std::index_sequence<ints...>> {}; 

int main() { 
    assert(sizeof(Wot<std::index_sequence<1, 2, 3>>) == 1); 
} 

này hoạt động trên kêu vang nhưng không hoạt động trên gcc, khi tôi thay đổi kiểu của chuyên môn hóa từng phần để chấp nhận std::size_t trong chuỗi chỉ mục, tuy nhiên nó hoạt động.

Ai là đúng? Clang hoặc gcc?


Xem nhóm này trong hành động ở đây https://wandbox.org/permlink/5YkuimK1pH3aKJT4

Trả lời

11

gcc là đúng. Đây chính là [temp.deduct.type]/18:

Nếu P có một hình thức có chứa <i>, và nếu loại i khác với các loại mẫu thông số tương ứng của mẫu được đặt tên bởi kèm theo đơn giản-template-id, khấu trừ không thành công. Nếu P có một biểu mẫu có chứa [i] và nếu loại i không phải là một loại không thể thiếu, thì khấu trừ không thành công. [Ví dụ:

template<int i> class A { /* ... */ }; 
template<short s> void f(A<s>); 
void k1() { 
    A<1> a; 
    f(a);    // error: deduction fails for conversion from int to short 
    f<1>(a);   // OK 
} 

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 
} 

- end dụ]

Mirroring ví dụ và đơn giản hóa các câu hỏi ban đầu:

template <class T> struct Wot { }; 

template <int... ints> 
void foo(Wot<std::index_sequence<ints...>>) { } 

int main() { 
    foo(Wot<std::index_sequence<1, 2, 3>>{}); // error 
    foo<1, 2, 3>({}); // ok 
} 

Tôi nghĩ rằng đây là kêu vang lỗi 16279

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