用户定义的字符串文字与Const字符串相比

时间:2017-11-24 11:42:30

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

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

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. 是否有任何优点 - 一方面有缺点?
  4. 我刚刚遇到user-defined literals的概念,我正试图更好地了解它们的功能和实用性。

    修改

    对那些试图回答的人来说,有点困惑。我熟悉const的用法。这些问题似乎不仅仅是一个问题。但一般来说,我想到的是更难用言语或问题的形式,但我试图得到的两者之间的差异的总体概念是:使用“常量标准”之间是否存在任何重大差异: :字符串“over”用户定义的字符串文字“?

2 个答案:

答案 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

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