用户定义的字符串文字与 Const 字符串的比较
User Defined String Literals compared to Const Strings
考虑以下具有这两种结构的代码:
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;
}
两个人之间有几个问题。
- 尽管它们产生相同的结果,但它们是否被认为是等效的?
- 相当于"memory foot print"、"compile-run time efficiency"等
- 每个pros/cons是什么
- 是否有任何优势-劣势?
我刚刚接触到 user-defined literals
的概念,我正试图更好地了解它们的功能和用途。
编辑
好吧,让那些试图回答的人有点困惑。我熟悉 const
的用法。问题似乎不止一个。但总的来说,我的想法很难用语言或问题的形式表达出来,但我试图了解的两者之间的区别的总体概念是:使用 [=39= 之间有什么主要区别吗? ] 超过 "user-defined string literals"?
std::string HELP = "Press F1 for help"_str;
与
没有区别
std::string HELP = "Press F1 for help";
std::string
可以从 C 风格的字符串构造。
Are these considered equivalent or not although they produce the same result?
除非编译器由于 const
可以执行一些更积极的优化,否则它们是相同的。
What are the pros/cons of each.
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" };
};
上面的代码保证没有动态分配,并确保可以在编译时计算常量。
Are there any advantages - disadvantages one over the other?
结构内部的可读性。
我可以立即理解 MessageConst
内部发生的事情,但我需要一两分钟才能理解 MessageLiterals
。
一道题题太多,哪里应该有一道题。
考虑以下具有这两种结构的代码:
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;
}
两个人之间有几个问题。
- 尽管它们产生相同的结果,但它们是否被认为是等效的?
- 相当于"memory foot print"、"compile-run time efficiency"等
- 每个pros/cons是什么
- 是否有任何优势-劣势?
我刚刚接触到 user-defined literals
的概念,我正试图更好地了解它们的功能和用途。
编辑
好吧,让那些试图回答的人有点困惑。我熟悉 const
的用法。问题似乎不止一个。但总的来说,我的想法很难用语言或问题的形式表达出来,但我试图了解的两者之间的区别的总体概念是:使用 [=39= 之间有什么主要区别吗? ] 超过 "user-defined string literals"?
std::string HELP = "Press F1 for help"_str;
与
没有区别std::string HELP = "Press F1 for help";
std::string
可以从 C 风格的字符串构造。
Are these considered equivalent or not although they produce the same result?
除非编译器由于 const
可以执行一些更积极的优化,否则它们是相同的。
What are the pros/cons of each.
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" };
};
上面的代码保证没有动态分配,并确保可以在编译时计算常量。
Are there any advantages - disadvantages one over the other?
结构内部的可读性。
我可以立即理解 MessageConst
内部发生的事情,但我需要一两分钟才能理解 MessageLiterals
。
一道题题太多,哪里应该有一道题。