2012-04-30 24 views
6

Hãy xem xét các chương trình sau đây:Sự thay thế có được thực hiện trên loại gói tham số variadic nếu gói bị trống không?

#include <type_traits> 

enum class dummy {}; 
template <typename T> 
using EnableIf = typename std::enable_if<T::value, dummy>::type; 
template <typename T> 
using DisableIf = typename std::enable_if<!T::value, dummy>::type; 

template <typename T> 
struct dependent_true_type : std::true_type {}; 

template <typename T, 
      EnableIf<dependent_true_type<T>>...> 
std::true_type f(); 
template <typename T, 
      DisableIf<dependent_true_type<T>>...> 
std::false_type f(); 

static_assert(decltype(f<int>())::value, ""); 

int main() {} 

GCC 4.7 glady chấp nhận chương trình này. Tiếng kêu gần đây của tôi 3.1 xây dựng tuyên bố cuộc gọi đến f là mơ hồ.

test.c++:22:24: fatal error: call to 'f' is ambiguous 
static_assert(decltype(f<int>())::value, ""); 
         ^~~~~~ 
test.c++:17:16: note: candidate function [with T = int, $1 = <>] 
std::true_type f(); 
      ^
test.c++:20:17: note: candidate function [with T = int, $1 = <>] 
std::false_type f(); 
       ^
1 error generated. 

Nó chấp nhận chương trình nếu tôi viết f<int, dummy{}>().

Có vẻ như tiếng kêu không xem xét loại gói tham số khi gói rỗng, điều này dẫn đến việc không loại bỏ gói đó khỏi nhóm ứng cử viên. GCC dường như thực hiện thay thế trên kiểu gói tham số ngay cả khi gói rỗng, và vì sự thay thế nói trên không thành công cho một tình trạng quá tải, không có sự mơ hồ.

Điều nào là đúng?

Trả lời

7

Tôi tin rằng tôi đã tìm thấy phần có liên quan của chuẩn. §14.8.2p7 nói:

Sự thay thế xảy ra trong tất cả các loại và biểu thức được sử dụng trong loại hàm và trong khai báo tham số mẫu.

EnableIf<dependent_true_type<T>> được sử dụng trong khai báo tham số mẫu, thay thế nên xảy ra và đây là a bug in clang.

+0

bạn có thể vui lòng nhận xét về PR và thêm testcase của bạn không? testcase của bạn là imho quan trọng hơn, bởi vì nó xảy ra trong quá trình khấu trừ đối số (testcase của tôi bỏ lỡ một sự thay thế chỉ ở cuối sau khi trích đối số) và vì clang khác với gcc. –

+0

@Johannes Xong. –

+0

cảm ơn anh chàng. . –

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