На перший погляд, це здається простим синтаксичним цукром.
Але, дивлячись глибше, ми бачимо, що це більше, ніж синтаксичний цукор, оскільки він розширює можливості користувача C ++ для створення визначених користувачем типів, які ведуть себе так само, як різні вбудовані типи. У цьому цей маленький «бонус» є дуже цікавим доповненням C ++ 11 до C ++.
Чи справді нам це потрібно в C ++?
Я бачу кілька застосувань у коді, про який писав у минулі роки, але те, що я не використовував його на C ++, не означає, що це не цікаво іншому розробнику C ++ .
Ми використовували в C ++ (і, напевно, у C), визначеному компілятором літерали, для введення цілих чисел як коротких чи довгих цілих чисел, дійсних чисел як плаваючі чи подвійні (або навіть довгі подвійні), а символьні рядки як звичайні чи широкі символи .
У C ++ у нас була можливість створювати власні типи (тобто класи), які потенційно не мають накладних витрат (вбудовування тощо). У нас була можливість додати операторів до їх типів, щоб вони поводилися як подібні вбудовані типи, що дозволяє розробникам C ++ використовувати матриці та складні числа так само природно, як це було б, якби вони були додані до самої мови. Ми навіть можемо додати операторів лиття (що зазвичай погана ідея, але іноді це лише правильне рішення).
Ми все ще пропустили одне, щоб типи користувачів поводилися як вбудовані типи: визначені користувачем літерали.
Отже, я думаю, це природна еволюція для мови, але бути максимально повною: " Якщо ви хочете створити тип, і ви хочете, щоб він максимум поводився як вбудовані типи, ось інструменти. .. "
Я думаю, це дуже схоже на рішення .NET зробити кожен примітив структурою, включаючи булеві числа, цілі числа тощо, і всі структури походять від Object. Саме таке рішення дозволяє .NET далеко виходити за межі Java під час роботи з примітивами, незалежно від того, скільки хакерських та розблокуючих хакерів Java додасть до своєї специфікації.
Вам справді це потрібно в C ++?
Це питання для ВАС відповіді. Не Bjarne Stroustrup. Не Трава Саттер. Не будь-яким членом стандартного комітету C ++. Ось чому у вас є вибір у C ++ , і вони не обмежуватимуть корисні позначення лише вбудованими типами.
Якщо вам це потрібно, то це вітальне доповнення. Якщо ви цього не зробите, ну ... Не використовуйте. Це вам нічого не коштуватиме.
Ласкаво просимо до C ++, мови, де функції необов’язкові.
Здутий ??? Покажіть мені свої комплекси !!!
Існує різниця між роздутим і складним (призначений для каламбура).
Як показано Niels at Які нові можливості додають визначені користувачем літерали до C ++? , вміння записати складне число - одна з двох функцій, доданих "нещодавно" до C та 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 ;
Тепер і C99 тип "подвійний комплекс", і тип C ++ "std :: complex" можна множити, додавати, віднімати тощо, використовуючи перевантаження оператора.
Але в C99 вони просто додали інший тип як вбудований тип, так і вбудовану підтримку перевантаження операторів. І вони додали ще одну вбудовану буквальну функцію.
В C ++ вони просто використовували існуючі функції мови, бачили, що буквальна особливість - це природна еволюція мови, і таким чином її додавали.
У C, якщо вам потрібне таке ж покращення позначень для іншого типу, вам не пощастить, поки ваше лобіювання не додасть ваші квантові хвильові функції (або 3D-точки, або будь-який базовий тип, який ви використовуєте у своїй галузі роботи) Стандарт C як вбудований тип вдається.
У C ++ 11 ви просто можете це зробити самостійно:
Point p = 25_x + 13_y + 3_z ; // 3D point
Він роздутий? Ні , в цьому є потреба, як показано тим, як і комплексам C, і C ++ потрібен спосіб представити свої буквальні комплексні значення.
Це неправильно розроблено? Ні , він розроблений як і всі інші функції C ++, маючи на увазі розширення.
Це лише для позначення? Ні , оскільки це може навіть додати безпеку типу до вашого коду.
Наприклад, уявимо код, орієнтований на 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 !
Тоді дуже легко застосувати сильне введення присвоєння значень.
Чи небезпечно?
Гарне питання. Чи можна використовувати ці функції в просторі імен? Якщо так, то джекпот!
У будь-якому випадку, як і все, ви можете вбити себе, якщо інструмент використаний неправильно . C є потужним, і ви можете відстріляти голову, якщо неправомірно використовувати C гармати. У C ++ є пістолет C, а також скальпель, тазер і будь-який інший інструмент, який ви знайдете в наборі інструментів. Можна зловживати скальпелем і знебарвити себе до смерті. Або ви можете створити дуже елегантний та надійний код.
Отже, як і кожна функція C ++, вона вам справді потрібна? Це питання, на яке ви повинні відповісти, перш ніж використовувати його в C ++. Якщо ви цього не зробите, це нічого не обійдеться. Але якщо вам це справді потрібно, принаймні, мова не підведе вас.
Приклад дати?
Мені здається, помилка в тому, що ви змішуєте операторів:
1974/01/06AD
^ ^ ^
Цього не уникнути, оскільки / будучи оператором, компілятор повинен його інтерпретувати. І, AFAIK, це добре.
Щоб знайти рішення вашої проблеми, я би написав буквальне якось іншим способом. Наприклад:
"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
Особисто я вибрав би цілі числа та дати ISO, але це залежить від ВАШИХ потреб. У чому полягає суть дозволу користувачеві визначати власні буквальні імена.