2016-12-30 43 views
18

Ngôn ngữ chức năng có khớp mẫu (đôi khi?) Có khả năng bỏ qua một số giá trị bị ràng buộc, nhưng với ràng buộc có cấu trúc C++ 17 dường như không có cách nào để làm điều đó (std::ignore with structured bindings?). Lời khuyên là sử dụng một tên giả, nhưng sau đó chúng tôi sẽ nhận được cảnh báo về các biến không sử dụng.ràng buộc có cấu trúc với [[might_unused]]

Với người đứng đầu mới nhất của cả hai kêu vang và gcc, điều này là điều mong đợi, đó là tốt đẹp và hữu ích,

[[maybe_unused]] auto x =4 ; // fine, no warning 
[[maybe_unused]] auto [a,dummyb,dummyc] = std::tuple<int,int,float>(1,1,1.0f); 

nhưng tôi cũng sẽ có hy vọng điều này sẽ làm việc:

auto [g,[[maybe_unused]]dummyh,[[maybe_unused]]dymmyi] = 
     std::tuple<int,int,float>(1,1,1.0f); 

Có một lý do cụ thể nào không thể sử dụng ở đây là attributes? (trong tiêu chuẩn cũng như về mặt kỹ thuật). Cả gcc hoặc clang đều không chấp nhận điều này.


Chỉnh sửa, thu thập trạng thái hỗ trợ: (nhờ godbolt/compiler explorer). Nó hoạt động như mong đợi trong (có thể là trước đó cũng):

  • gcc 8,0 thân cây (g ++ 8.0.0 20.171.015 thử nghiệm)
  • kêu vang 4.0.0
  • icc 18 (không kiểm tra, theo specs)

MSVC 17.3.5 (và GUI của Visual Studio), cho phép thuộc tính nhưng không hoạt động với các ràng buộc có cấu trúc. bug report

+2

Tôi tưởng tượng rằng khả năng chặn phân tách lồng nhau có thể là một mối quan tâm. –

+0

Hmm. Ok ... '[g, [[might_unused]]] = foo()' .. Tôi càng nghĩ về nó, tôi càng tốt với việc đặt thuộc tính duy nhất đó ở bên ngoài :-) –

+0

vấn đề là bạn sẽ không biết biến nào không được sử dụng mặc dù nếu nó ở bên ngoài – serine

Trả lời

8

Trong giấy cam kết ràng buộc cấu trúc:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0144r2.pdf

họ thảo luận về lập luận của họ:

3,8 Nếu có một cách để bỏ qua một cách rõ ràng thành phần?

Động lực sẽ là làm im lặng cảnh báo trình biên dịch về các tên không sử dụng. Chúng tôi nghĩ rằng câu trả lời nên là “chưa.” Điều này không có động lực khi sử dụng trường hợp (im lặng trình biên dịch cảnh báo là một động lực, nhưng nó không phải là một trường hợp sử dụng) và tốt nhất còn lại cho đến khi chúng tôi có thể xem lại điều này trong ngữ cảnh của đề xuất phù hợp với mô hình chung hơn, trong đó trường hợp này cần rơi ra như một trường hợp đặc biệt.

đối xứng với std :: tie sẽ đề nghị sử dụng một cái gì đó giống như một std :: bỏ qua:

tuple<T1,T2,T3> f(); 
    auto [x, std::ignore, z] = f(); // NOT proposed: ignore second element 

Tuy nhiên, điều này cảm thấy khó xử.

Dự mẫu tương ứng trong ngôn ngữ có thể đề xuất một ký tự đại diện như _ hoặc *, nhưng vì chúng ta chưa có mô hình phù hợp với nó là quá sớm để chọn một cú pháp mà chúng ta biết sẽ tương thích. Đây là tiện ích mở rộng thuần túy có thể chờ để được xem là với mẫu phù hợp.

Mặc dù điều này không giải quyết rõ ràng [[maybe_unused]], tôi cho rằng lý do có thể giống nhau. Dừng cảnh báo trình biên dịch không phải là trường hợp sử dụng.

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