【问题标题】:User Defined String Literals compared to Const Strings用户定义的字符串文字与常量字符串的比较
【发布时间】:2017-11-24 11:42:30
【问题描述】:

考虑以下具有这两种结构的代码:

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: :strings" 优于 "用户定义的字符串文字"?

【问题讨论】:

  • 只是一个小注释,不需要定义_str,可以使用内置的文字s。
  • 每个问题一个问题。您应该尝试缩小范围。
  • 您的核心问题实际上是关于不同形式的初始化,而不是初始化表达式恰好表示为用户定义的文字这一事实。
  • @OriBS 我对内置很熟悉。我只是想更好地了解literals 并使用const stringuser defined string literal 之间的差异来比较它们。

标签: c++ string string-literals user-defined-literals const-string


【解决方案1】:
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" };
};

上面的代码保证没有动态分配,并确保可以在编译时评估常量。

【讨论】:

  • 我知道我可以使用constexpr。我只是想对const stringuser-defined string literal 的主要区别进行概括。
【解决方案2】:

各有优劣吗?

可读性在结构中。

我可以立即了解MessageConst 内部发生的事情,但我需要一两分钟才能了解MessageLiterals


一个问题太多问题,哪里应该有一个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2013-08-06
    相关资源
    最近更新 更多