2017-12-18 133 views
9

Gần đây tôi có vấn đề với mã như thế này:Tại sao trình biên dịch không thể suy ra tham số mẫu tự động trừ khi tôi thêm const?

constexpr auto lambda = []{}; 

template<auto& l> 
struct Lambda {}; 

template<auto& l> 
void test(Lambda<l>) {} 

int main() { 
    test(Lambda<lambda>{}); 
} 

Cả kêu vang và GCC nói rằng nó không thể suy ra l.

Tuy nhiên, nếu tôi thêm const có:

// ----v 
template<const auto& l> 
void test(Lambda<l>) {} 

Sau đó, mọi thứ hoạt động với kêu vang. GCC vẫn không thành công. Điều gì đang xảy ra ở đây? Liệu nó có thể không tự mình suy ra số const? Đây có phải là lỗi GCC để nó không khấu trừ l trong cả hai trường hợp không?

Trả lời

8

Đây có phải là lỗi GCC để nó không suy ra l trong cả hai trường hợp không?

Đó là lỗi và cũng cho Clang. Đối với một loại placeholder phi kiểu lập luận, [temp.arg.nontype]/1 nói:

Nếu kiểu của một mẫu tham số chứa một loại placeholder, các suy luận kiểu tham số được xác định từ loại của mẫu đối số bằng cách giữ chỗ loại khấu trừ. Nếu loại trừ tham số không được phép khai báo tham số mẫu ([temp.param]), chương trình bị hỏng.

Quá trình rất giống nhau mà nó sẽ suy ra đây

int main() { 
    auto& l = lambda; 
} 

Đó l là tham chiếu const.

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