У C ++ 11 представлена дуже зручна функція, яка називається необробленими рядковими літералами, що є рядками без символів виходу. І замість того, щоб писати це:
regex mask("\\t[0-9]+\\.[0-9]+\\t\\\\SUB");
Ви можете просто написати це:
regex mask(R"(\t[0-9]+\.[0-9]+\t\\SUB)");
Досить читабельніший. Однак зверніть увагу, що додаткові дужки навколо рядка потрібно розмістити, щоб визначити необроблений літеральний рядок.
Моє запитання: навіщо вони нам взагалі потрібні? Для мене це виглядає досить потворно і нелогічно. Ось мінуси, які я бачу:
- Додаткова багатослівність, тоді як вся функція використовується, щоб зробити літерали більш компактними
- Важко розрізнити тіло буквального і визначального символів
Ось що я маю на увазі під жорстким розрізненням:
"good old usual string literal"
^- body inside quotes -^
R"(new strange raw string literal)"
^- body inside parenthesis -^
І ось плюси:
- Більша гнучкість, більше символів, доступних у необроблених рядках, особливо при використанні з роздільником:
"delim( can use "()" here )delim"
Але, ей, якщо вам потрібна більша гнучкість, у вас є старі хороші рядові літерали, які можна уникнути. Чому стандартний комітет вирішив забруднити вміст кожного сирого літерального рядка цими абсолютно непотрібними дужками? Що було обгрунтуванням цього? Які плюси я не згадав?
UPD Відповідь Керрека чудова, але, на жаль, це не відповідь. Оскільки я вже описав, що розумію, як це працює і які переваги це дає. З того часу, як я задав це питання, минуло п’ять років, і відповіді досі немає. І я все ще розчарований цим рішенням. Можна сказати, що це питання смаку, але я б не погодився. Скільки просторів ви використовуєте, як ви називаєте свої змінні, це SomeFunction()
чи some_function()
- це справа смаку. І я справді легко переходжу з одного стилю на інший.
Але це? .. Досі відчуваєш себе незграбним і незграбним через стільки років. Ні, це не стосується смаку. Це приблизно те, як ми хочемо висвітлити всі можливі випадки, незважаючи ні на що. Ми приречені писати ці потворні паренси щоразу, коли нам потрібно писати специфічний для Windows шлях, або регулярний вираз, або багаторядковий рядок-літерал. І для чого? .. Для тих рідкісних випадків, коли насправді нам потрібно ввести "
рядок? Я хотів би бути на тому засіданні комітету, де вони вирішили зробити це таким чином. І я був би рішуче проти цього дійсно поганого рішення. Я бажаю. Зараз ми приречені.
Дякую, що прочитали це далеко. Зараз я почуваюся трохи краще.
UPD2 Ось мої альтернативні пропозиції, які, на мою думку, були б НАБАГАТО кращими за існуючі.
Пропозиція 1. Натхненний python. Неможливо підтримати рядкові літерали з потрійними лапками:R"""Here is a string literal with any content, except for triple quotes, which you don't actually use that often."""
Пропозиція 2. Натхненний здоровим глуздом. Підтримує всі можливі рядкові літерали, точно так само як поточний: R"delim"content of string"delim"
. З порожнім роздільником: R""Looks better, doesn't it?""
. Порожній сирець рядок: R""""
. Сирі рядки в подвійних лапках: R"#"Here are double quotes: "", thanks"#"
.
У вас є проблеми з цими пропозиціями?
R";-](R"(this is a basic raw string literal as text inside a more complex one)");-]"