Các tính năng mới trong C ++ 17 là gì?


1007

C ++ 17 hiện đã có tính năng hoàn chỉnh, do đó không có khả năng trải nghiệm những thay đổi lớn. Hàng trăm đề xuất đã được đưa ra cho C ++ 17.

Những tính năng nào được thêm vào C ++ trong C ++ 17?

Khi sử dụng trình biên dịch C ++ hỗ trợ "C ++ 1z", những tính năng nào sẽ có sẵn khi trình biên dịch cập nhật lên C ++ 17?


26
Danh sách đầy đủ các tính năng theo Clang: thư viện , ngôn ngữ cốt lõi .
Kerrek SB

3
blog này bost có một bản tóm tắt hay: bfilipek.com/2017/01/cpp17features.html
atb

13
Xem các thay đổi chính thức giữa tài liệu C ++ 14 và C ++ 17 DIS (P0636r0) để biết danh sách các thay đổi lớn từ C ++ 14 đến C ++ 17.
jotik

1
@RaghavNavada Tuyệt vời! Phần C ++ 20 có được duy trì không? Có # 53 , nhưng nó đóng cửa ...
LF

Mọi thứ trong trang web này en.cppreference.com/w/cpp được đánh dấu bằng phiên bản bắt buộc.
jw_

Câu trả lời:


1266

Đặc điểm ngôn ngữ:

Mẫu và Mã chung

Lambda

Thuộc tính

Dọn dẹp cú pháp

Điều khiển lưu lượng và hồi lưu sạch hơn

  • Cấu trúc liên kết

    • Về cơ bản, hạng nhất std::tievớiauto
    • Thí dụ:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • Tạo các biến itinsertedvới loại suy ra từ trả về pairđó map::insert.
    • Hoạt động với tuple / cặp thích & std::arrays và cấu trúc tương đối bằng phẳng
    • Trên thực tế có tên là các ràng buộc có cấu trúc trong tiêu chuẩn
  • if (init; condition)switch (init; condition)

    • if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
    • Mở rộng các if(decl)trường hợp declkhông chuyển đổi thành bool một cách hợp lý.
  • Tổng quát hóa dựa trên phạm vi cho các vòng lặp

    • Xuất hiện chủ yếu là hỗ trợ cho các Sentinel, hoặc các trình lặp kết thúc không cùng loại với các trình vòng lặp bắt đầu, giúp các vòng lặp kết thúc null và tương tự.
  • nếu constexpr

    • Nhiều tính năng được yêu cầu để đơn giản hóa mã gần như chung chung.

Linh tinh

Thư viện bổ sung:

Loại dữ liệu

  • std::variant<Ts...>

    • Hầu như luôn luôn không trống cuối cùng tôi đã kiểm tra?
    • Tagged loại công đoàn
    • {tuyệt vời | hữu ích}
  • std::optional

    • Có thể giữ một trong những thứ
    • Vô cùng hữu ích
  • std::any

    • Giữ một trong mọi thứ (có thể sao chép)
  • std::string_view

    • std::string như tham chiếu đến mảng ký tự hoặc chuỗi con
    • Không bao giờ mất một string const&lần nữa. Cũng có thể làm cho phân tích cú pháp nhanh hơn một lần.
    • "hello world"sv
    • constexpr char_traits
  • std::byte nhiều hơn họ có thể nhai.

    • Không phải là số nguyên hay ký tự, chỉ là dữ liệu

Gọi công cụ

Hệ thống tệp TS v1

Thuật toán mới

  • for_each_n

  • reduce

  • transform_reduce

  • exclusive_scan

  • inclusive_scan

  • transform_exclusive_scan

  • transform_inclusive_scan

  • Đã thêm cho mục đích luồng, được hiển thị ngay cả khi bạn không sử dụng chúng theo luồng

Luồng

(một phần của) Nguyên tắc cơ bản của Thư viện TS v1 không được đề cập ở trên hoặc dưới

Cải tiến container

Thay đổi con trỏ thông minh

Các stdcải tiến kiểu dữ liệu khác :

Linh tinh

Đặc điểm

Không dùng nữa

Isocpp.org có một danh sách thay đổi độc lập kể từ C ++ 14; nó đã bị cướp phá một phần

Đương nhiên công việc TS tiếp tục song song, vì vậy có một số TS chưa hoàn toàn chín muồi sẽ phải chờ lần lặp tiếp theo. Mục tiêu cho lần lặp tiếp theo là C ++ 20 như kế hoạch trước đó, không phải C ++ 19 như một số tin đồn ngụ ý. C ++ 1O đã được tránh.

Danh sách ban đầu được lấy từ bài đăng reddit nàybài đăng reddit này , với các liên kết được thêm thông qua googling hoặc từ trang isocpp.org ở trên.

Các mục bổ sung được liệt kê từ danh sách kiểm tra tính năng SD-6 .

danh sách tính năng của clangdanh sách tính năng thư viện bên cạnh được đánh dấu. Điều này dường như không đáng tin cậy, vì nó là C ++ 1z, không phải C ++ 17.

những slide này có một số tính năng bị thiếu ở nơi khác.

Mặc dù "những gì đã bị xóa" không được hỏi, đây là một danh sách ngắn gồm một vài điều ((chủ yếu là?) Không dùng nữa) đã bị xóa trong C ++ 17 từ C ++:

Đã xóa:

Có sự điều chỉnh lại. Tôi không chắc chắn nếu những điều này có bất kỳ tác động nào đến mã, hoặc nếu chúng chỉ là phần dọn dẹp trong tiêu chuẩn:

Giấy tờ chưa được tích hợp vào ở trên:

  • P0505R0 ( chexo chrono)

  • P0418R2 (tinh chỉnh nguyên tử)

  • P0512R0 (điều chỉnh khấu trừ đối số mẫu)

  • P0490R0 (chỉnh sửa ràng buộc có cấu trúc)

  • P0513R0 (thay đổi thành std::hash)

  • P0502R0 (ngoại lệ song song)

  • P0509R1 (cập nhật các hạn chế về xử lý ngoại lệ)

  • P0012R1 (làm cho các thông số kỹ thuật ngoại lệ là một phần của hệ thống loại)

  • P0510R0 (hạn chế về các biến thể)

  • P0504R0 (thẻ cho tùy chọn / biến thể / bất kỳ)

  • P0497R0 (chỉnh ptr chia sẻ)

  • P0508R0 (xử lý nút liên kết có cấu trúc)

  • P0521R0 (số lượng sử dụng con trỏ dùng chung và các thay đổi duy nhất?)

Thông số kỹ thuật thay đổi:

Tham khảo thêm:


2
Ừm, memory_order_consumedường như không được chính thức phản đối. Nó chỉ là không khuyến khích trong ghi chú. Có lẽ nó có ý nghĩa để đề cập đến điều này (ví dụ với dấu ngoặc đơn)?
LF
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.