2015-02-13 27 views
6

Tôi vừa đọc về tính năng mới có tên là "khấu trừ kiểu trả về" có sẵn trong C++ 14 và tôi có câu hỏi về đệ quy trong hàm của kiểu đó. Tôi đã học được rằng sự trở lại đầu tiên trong hàm đó phải cho phép suy ra kiểu trả về.Trả lại loại khấu trừ trong C++ 14

Các ví dụ do Wiki cung cấp hoàn toàn đáp ứng quy tắc đó.

auto Correct(int i) { 
    if (i == 1) 
    return i;    // return type deduced as int 
    else 
    return Correct(i-1)+i; // ok to call it now 
} 

auto Wrong(int i) { 
    if (i != 1) 
    return Wrong(i-1)+i; // Too soon to call this. No prior return statement. 
    else 
    return i;    // return type deduced as int 
} 

Câu hỏi của tôi là: Tại sao khi tôi đã thay đổi Wrong(int i)-Wrong(auto i), Wrong chức năng bắt đầu để biên dịch? Điều gì ẩn sau sự thay đổi nhỏ này?

+4

Về cơ bản, bạn đã tạo 'Sai' thành mẫu chức năng. –

+8

'auto' như một tham số trong một hàm thông thường là phần mở rộng GCC, không phải chuẩn C++ 14. –

+0

[không biên dịch] (http://coliru.stacked-crooked.com/a/d54be4e8410c0a7f) –

Trả lời

6

Tôi tin rằng đây là lỗi trong việc triển khai phần mở rộng của GCC đối với C++ 14 auto. Đây là một chương trình mà dường như được thiết kế để làm việc:

auto f(auto i) { 
    return ""; 
} 

int main() { 
    const char *s = f(1); 
    return 0; 
} 

Nó không làm việc, nó không thành công với "lỗi: chuyển đổi không hợp lệ từ 'int' thành 'const char *'" vì GCC xác định, đối với một số lý do, rằng kiểu trả về phải giống với kiểu tham số.

Lỗi tương tự đó có thể làm cho mã bị từ chối, chẳng hạn như những gì trong câu hỏi của bạn, biên dịch mà không có vấn đề gì.

Tất nhiên, lỗi này không ảnh hưởng đến sự phù hợp, vì không có chương trình C++ 14 hợp lệ nào có thể sử dụng các tham số auto bên ngoài lambdas.

Nó xảy ra đã được báo cáo khoảng một tuần trước để các nhà phát triển GCC như bug #64969, như là kết quả của another question on SO about it.

+0

Câu hỏi tương tự [tại đây] (https://stackoverflow.com/questions/26571592/function-returning-auto-with-auto-parameter-munmap-chunk-invalid-pointer) (cho câu trả lời của bạn, không phải câu hỏi này.) –

+0

@remyabel Cảm ơn. Tôi cũng đang xem qua các báo cáo lỗi, nhưng tôi đang gặp khó khăn khi tìm kiếm bất kỳ thứ gì ở đó. – hvd

+0

Nếu bạn sẵn sàng sàng lọc thông qua các khái niệm TS, bạn có thể xác định xem hành vi của GCC là lỗi hay "tuân thủ". Chúng được gọi là "Mẫu chức năng viết tắt" ngay bây giờ. –

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