2

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

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

4

2 回答 2

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" };
};

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

于 2017-11-24T11:50:43.367 回答
1

是否有任何优点 - 缺点之一?

结构内部的可读性

我能立刻明白里面发生了什么MessageConst,但我需要一两分钟才能明白MessageLiterals


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

于 2017-11-24T11:50:55.743 回答