Ngay từ cái nhìn đầu tiên, nó có vẻ là đường cú pháp đơn giản.
Nhưng khi nhìn sâu hơn, chúng ta thấy nó còn hơn cả cú pháp, vì nó mở rộng các tùy chọn của người dùng C ++ để tạo ra các loại do người dùng định nghĩa hoạt động chính xác như các loại tích hợp riêng biệt. Trong đó, "phần thưởng" nhỏ này là một bổ sung C ++ 11 rất thú vị cho C ++.
Chúng ta có thực sự cần nó trong C ++ không?
Tôi thấy một vài cách sử dụng mã tôi đã viết trong những năm qua, nhưng chỉ vì tôi không sử dụng nó trong C ++ không có nghĩa là nó không thú vị đối với một nhà phát triển C ++ khác .
Chúng tôi đã sử dụng trong C ++ (và trong C, tôi đoán), nghĩa đen do trình biên dịch xác định, để nhập số nguyên là số nguyên ngắn hoặc dài, số thực là số float hoặc double (hoặc thậm chí dài gấp đôi) và chuỗi ký tự là ký tự bình thường hoặc rộng .
Trong C ++, chúng tôi có khả năng tạo các kiểu của riêng mình (ví dụ: các lớp), có khả năng không có chi phí hoạt động (nội tuyến, v.v.). Chúng tôi có khả năng thêm các toán tử vào các kiểu của chúng, để chúng hoạt động giống như các kiểu dựng sẵn tương tự, cho phép các nhà phát triển C ++ sử dụng ma trận và các số phức một cách tự nhiên nếu chúng được thêm vào ngôn ngữ. Chúng tôi thậm chí có thể thêm các toán tử cast (thường là một ý tưởng tồi, nhưng đôi khi, đó chỉ là giải pháp phù hợp).
Chúng tôi vẫn bỏ lỡ một điều để các loại người dùng hoạt động như các loại tích hợp: nghĩa đen do người dùng định nghĩa.
Vì vậy, tôi đoán đó là một sự phát triển tự nhiên của ngôn ngữ, nhưng phải hoàn chỉnh nhất có thể: " Nếu bạn muốn tạo một loại và bạn muốn nó hoạt động nhiều nhất có thể như các loại tích hợp, đây là các công cụ. .. "
Tôi đoán nó rất giống với quyết định của .NET về việc biến mọi cấu trúc nguyên thủy, bao gồm cả booleans, số nguyên, v.v. và có tất cả các cấu trúc xuất phát từ Object. Quyết định này một mình đưa .NET vượt xa tầm với của Java khi làm việc với các nguyên thủy, bất kể việc hack / unboxing bao nhiêu mà Java sẽ thêm vào đặc tả của nó.
Bạn có thực sự cần nó trong C ++?
Câu hỏi này dành cho BẠN trả lời. Không phải Bjarne Stroustrup. Không phải thảo mộc Sutter. Không phải bất cứ thành viên nào của ủy ban tiêu chuẩn C ++. Đây là lý do tại sao bạn có sự lựa chọn trong C ++ và họ sẽ không giới hạn ký hiệu hữu ích cho các loại tích hợp.
Nếu bạn cần nó, thì đó là một bổ sung được chào đón. Nếu bạn không, tốt ... Đừng sử dụng nó. Nó sẽ không mất gì.
Chào mừng bạn đến với C ++, ngôn ngữ mà các tính năng là tùy chọn.
Bồng bềnh ??? Cho tôi xem phức tạp của bạn !!!
Có một sự khác biệt giữa cồng kềnh và phức tạp (ý định chơi chữ).
Giống như được hiển thị bởi Niels tại Những khả năng mới nào mà người dùng do người dùng định nghĩa thêm vào C ++? , việc có thể viết một số phức là một trong hai tính năng được thêm "gần đây" vào C và C ++:
// C89:
MyComplex z1 = { 1, 2 } ;
// C99: You'll note I is a macro, which can lead
// to very interesting situations...
double complex z1 = 1 + 2*I;
// C++:
std::complex<double> z1(1, 2) ;
// C++11: You'll note that "i" won't ever bother
// you elsewhere
std::complex<double> z1 = 1 + 2_i ;
Bây giờ, cả loại "kép phức tạp" C99 và loại "std :: phức tạp" C ++ đều có thể được nhân, thêm, trừ, v.v., bằng cách sử dụng quá tải toán tử.
Nhưng trong C99, họ chỉ thêm một loại khác là loại tích hợp và hỗ trợ nạp chồng toán tử tích hợp. Và họ đã thêm một tính năng nghĩa đen tích hợp.
Trong C ++, họ chỉ sử dụng các tính năng hiện có của ngôn ngữ, thấy rằng tính năng nghĩa đen là sự phát triển tự nhiên của ngôn ngữ, và do đó đã thêm nó.
Trong C, nếu bạn cần tăng cường ký hiệu tương tự cho loại khác, bạn sẽ không gặp may cho đến khi vận động hành lang để thêm các hàm sóng lượng tử (hoặc điểm 3D hoặc bất kỳ loại cơ bản nào bạn đang sử dụng trong lĩnh vực công việc của mình) vào Tiêu chuẩn C như một loại tích hợp thành công.
Trong C ++ 11, bạn chỉ có thể tự làm điều đó:
Point p = 25_x + 13_y + 3_z ; // 3D point
Có phải là cồng kềnh? Không , nhu cầu là có, như thể hiện bằng cách cả hai phức C và C ++ cần một cách để biểu diễn các giá trị phức tạp theo nghĩa đen của chúng.
Có phải nó được thiết kế sai? Không , nó được thiết kế như mọi tính năng C ++ khác, với khả năng mở rộng.
Có phải chỉ cho mục đích ký hiệu? Không , vì nó thậm chí có thể thêm loại an toàn cho mã của bạn.
Ví dụ: hãy tưởng tượng một mã định hướng CSS:
css::Font::Size p0 = 12_pt ; // Ok
css::Font::Size p1 = 50_percent ; // Ok
css::Font::Size p2 = 15_px ; // Ok
css::Font::Size p3 = 10_em ; // Ok
css::Font::Size p4 = 15 ; // ERROR : Won't compile !
Sau đó, rất dễ dàng để thực thi một kiểu gõ mạnh vào việc gán các giá trị.
Có nguy hiểm không?
Câu hỏi hay. Các chức năng này có thể được đặt tên? Nếu có, thì Jackpot!
Dù sao, giống như mọi thứ, bạn có thể tự sát nếu một công cụ được sử dụng không đúng cách . C rất mạnh và bạn có thể bắn đầu nếu bạn lạm dụng súng C. C ++ có súng C, nhưng cũng có dao mổ, taser và bất kỳ công cụ nào khác bạn sẽ tìm thấy trong bộ công cụ. Bạn có thể lạm dụng dao mổ và tự chảy máu đến chết. Hoặc bạn có thể xây dựng mã rất thanh lịch và mạnh mẽ.
Vì vậy, giống như mọi tính năng của C ++, bạn có thực sự cần nó không? Đó là câu hỏi bạn phải trả lời trước khi sử dụng nó trong C ++. Nếu bạn không, nó sẽ không mất gì. Nhưng nếu bạn thực sự cần nó, ít nhất, ngôn ngữ sẽ không làm bạn thất vọng.
Ví dụ ngày?
Theo tôi, lỗi của bạn là do bạn đang trộn các toán tử:
1974/01/06AD
^ ^ ^
Điều này không thể tránh được, bởi vì / là một toán tử, trình biên dịch phải diễn giải nó. Và, AFAIK, đó là một điều tốt.
Để tìm một giải pháp cho vấn đề của bạn, tôi sẽ viết nghĩa đen theo một cách khác. Ví dụ:
"1974-01-06"_AD ; // ISO-like notation
"06/01/1974"_AD ; // french-date-like notation
"jan 06 1974"_AD ; // US-date-like notation
19740106_AD ; // integer-date-like notation
Cá nhân, tôi sẽ chọn số nguyên và ngày ISO, nhưng nó phụ thuộc vào nhu cầu của BẠN. Đó là toàn bộ quan điểm cho phép người dùng xác định tên theo nghĩa đen của riêng mình.