Пользовательские строковые литералы по сравнению с константными строками

Рассмотрим следующий код с этими двумя структурами:

std::string operator"" _str(const char* str, std::size_t len) {
return std::string( str, len );
}

struct MessageLiterals {
std::string HELP  = "Press F1 for help"_str;
std::string ABOUT = "Press F2 for about"_str;
std::string EXIT  = "Press ESC to exit"_str;
};

struct MessageConst {
const std::string HELP { "Press F1 for help" };
const std::string ABOUT { "Press F2 for about" };
const std::string EXIT { "Press ESC to exit" };
};

int main() {

MessageLiterals ml;
std::cout << "Using Literals:\n";
std::cout << ml.HELP << std::endl;
std::cout << ml.ABOUT << std::endl;
std::cout << ml.EXIT << std::endl;
std::cout << std::endl;

MessageConst mc;
std::cout << "Using Constant Strings:\n";
std::cout << mc.HELP << std::endl;
std::cout << mc.ABOUT << std::endl;
std::cout << mc.EXIT << std::endl;

std::cout << "\nPress any key and enter to quit." << std::endl;
char c;
std::cin >> c;

return 0;
}

Пара вопросов приходит на ум между ними.

  1. Они считаются эквивалентными или нет, хотя они дают одинаковый результат?
    • Эквивалентен средствам «отпечаток памяти», «эффективность времени компиляции» и т. Д.
  2. Каковы плюсы / минусы каждого.
  3. Есть ли преимущества — недостатки одного перед другим?

Я только что натолкнулся на концепцию user-defined literals и я пытаюсь лучше понять их функциональность и полезность.

РЕДАКТИРОВАТЬ

Хорошо, немного смущения для тех, кто пытается ответить. Я знаком с использованием const, Вопрос (ы) кажется, что это больше, чем один. Но в целом то, что я имел в виду, сложнее выразить словами или формой вопроса, но общая концепция различий между двумя, к которым я пытался прийти, заключалась в следующем: есть ли существенные различия между использованием «константы std: : строки «над» пользовательскими строковыми литералами «?

2

Решение

std::string HELP  = "Press F1 for help"_str;

ничем не отличается от

std::string HELP  = "Press F1 for help";

std::string может быть построен из строки в стиле C.


Они считаются эквивалентными или нет, хотя они дают одинаковый результат?

Если компилятор не может выполнить более агрессивную оптимизацию благодаря const, они одинаковые.


Каковы плюсы / минусы каждого.

const предотвращает случайную мутацию ваших строковых констант.


Вам не нужно использовать std::string здесь — у вас есть константы времени компиляции, которые могут быть constexpr:

struct MessageConst {
static constexpr const char* HELP { "Press F1 for help" };
static constexpr const char* ABOUT { "Press F2 for about" };
static constexpr const char* EXIT { "Press ESC to exit" };
};

Приведенный выше код гарантирует отсутствие динамического распределения и гарантирует, что константы могут быть оценены во время компиляции.

3

Другие решения

Есть ли преимущества — недостатки одного перед другим?

читабельность внутри структуры.

Я могу сразу понять, что происходит внутри MessageConst, но мне нужен момент или два, чтобы понять MessageLiterals,


Слишком много вопросов в одном вопросе, где должен быть один вопрос.

1