'auto' làm chỗ giữ đối số mẫu cho tham số hàm


22

C ++ 20 cho phép sử dụng autocho loại tham số chức năng.

Có phải nó cũng cho phép sử dụng autonhư một trình giữ chỗ đối số mẫu (không tương tự, nhưng theo tinh thần của mẫu C ++ 17 <auto> theo cách nào) cho loại tham số chức năng?

Vì vậy, đoạn mã sau, tiền C ++ 20:

template<typename First, typename Second>
void printPair(const std::pair<First, Second>& p) {
    std::cout << p.first << ", " << p.second;
}

Có thể được viết là:

void printPair(const std::pair<auto, auto>& p) {
    std::cout << p.first << ", " << p.second;
}

biên dịch và hoạt động độc đáo với triển khai GCC thử nghiệm cho các khái niệm.

Đây có phải là một cú pháp hợp pháp với C ++ 20?


Từ những gì tôi đã nghe, không bị ràng buộc auto trực tiếp chuyển thành templatised typename XYZ, điều này sẽ ngụ ý mạnh mẽ rằng đó là cú pháp hợp pháp. Gọn gàng .
Fureeish

2
Lưu ý rằng Clang không đồng ý và Clang và GCC có sự bất đồng giống nhau về việc có autođược phép vào [](const std::pair<auto, auto>& p){}hay không (cho dù có -std=c++2ahoặc -std=c++17).
quả óc chó


Cảm ơn bạn @DavisHerring - Tôi đã sửa từ ngữ
Amir Kirsh

Câu trả lời:


17

Cú pháp này hợp lệ trong Đặc tả kỹ thuật khái niệm C ++, nhưng không có trong C ++ 20. Trong các khái niệm C ++ 20, autochỉ được phép ở cấp cao nhất trong một loại tham số hàm. Quy tắc có liên quan là [dcl.spec.auto] đoạn 2 :

Một trình xác định kiểu giữ chỗ của ràng buộc kiểu biểu mẫu [opt] autocó thể được sử dụng như một trình xác định từ chối của trình xác định khai báo -seq của một khai báo tham số của khai báo hàm hoặc biểu thức lambda và, nếu nó không phải là auto type-specifier giới thiệu kiểu trailing-return-type (xem bên dưới), là một giữ chỗ kiểu tham số chung của khai báo hàm hoặc biểu thức lambda. [Lưu ý: Có một trình giữ chỗ kiểu tham số chung biểu thị rằng hàm là một mẫu hàm viết tắt (9.3.3.5 [dcl.fct]) hoặc lambda là lambda chung (7.5.5 [expr.prim.lambda]). Lưu ý

(Nếu bạn kiểm tra từ ngữ trong bản thảo làm việc gần đây nhất tại thời điểm viết bài, bạn sẽ thấy một quy tắc hơi khác. Quy tắc trên đã được sửa đổi bởi vấn đề cốt lõi 2447 , được bình chọn vào bản thảo cuối cùng của C ++ 20 tại Prague cuộc họp ủy ban một tuần trước.)

Các bộ xác định từ chối trong một tham số hàm là chuỗi từ khóa ban đầu và tên loại khi bắt đầu khai báo tham số. Quy tắc trên cho phép autoở cấp cao nhất:

void f(auto x);

... nhưng chỉ là một công cụ xác định giảm . autokhông được phép khi lồng trong bộ xác định từ chối :

void f(std::vector<auto> x);

... và cũng không được phép ở nơi khác trong loại tham số:

void f(void (*p)(auto));

Ồ, tôi không biết điều đó! Liên kết CWG hiện cung cấp 404, vì vậy bạn có thể giải thích ngắn gọn lý do căn bản cho hạn chế này không?
LF

Điều này là hoàn toàn đáng thất vọng.
Fureeish

1
Xin lỗi, vấn đề CWG và thay đổi từ ngữ của nó chưa được hiển thị công khai. Quy tắc trong câu hỏi được giới thiệu bởi open-std.org/jtc1/sc22/wg21/docs/ con / 2018 / p1141r2.html và ý định / lý do là phù hợp với những gì chúng tôi đã cho phép đối với lambdas chung.
Richard Smith

4
@LF: Dù sao thì vấn đề CWG không thực sự có liên quan: nó đã sửa một lỗi từ ngữ ngụ ý rằng việc sử dụng nhất định autocho loại trả về theo dõi được tính là loại autosử dụng này.
Davis Herring
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.