考虑以下具有以下两种结构的代码:
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;
}
两者之间会想到几个问题。
我刚刚遇到user-defined literals
的概念,我正试图更好地了解它们的功能和实用性。
修改
对那些试图回答的人来说,有点困惑。我熟悉const
的用法。这些问题似乎不仅仅是一个问题。但一般来说,我想到的是更难用言语或问题的形式,但我试图得到的两者之间的差异的总体概念是:使用“常量标准”之间是否存在任何重大差异: :字符串“over”用户定义的字符串文字“?
答案 0 :(得分:3)
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" };
};
上面的代码保证不进行动态分配,并确保可以在编译时评估常量。
答案 1 :(得分:1)
结构中的是否有任何优点 - 一方面有缺点?
可读性。
我可以立即了解MessageConst
内发生的事情,但我需要一两个时间来理解MessageLiterals
。
一个问题中的问题太多,哪里应该有一个问题。