c++ 这个临时的std::string表达式可以接受吗?

zc0qhyus  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(99)

我意识到这不是最有效的做法,但是大多数C++可以接受创建临时的std::string对象进行连接吗,就像第4行这样?

constexpr const char* const a = "This is ";
constexpr const char* const b = "a test.";

std::string s2 = std::string(a) + std::string(b);
std::cout << "*** " << s2 << std::endl;

我必须在许多地方更新一些代码,以前使用std::string串联,现在使用这些constexpr字符串常量,似乎更容易只是下降到一些std::string(...)构造函数来快速更新代码。
正如我列出的那样,这在Visual C中是有效的,而且似乎是在支持C14的gcc版本中编译的(还需要测试)。

a64a0gku

a64a0gku1#

这是一个有效的解决方案,但效率低,而且有点不吸引人。注意,将第一个操作数强制转换为std::string就足够了。这稍微更有效率。

从C++20开始std::format()是最好的方法。
如果您坚持使用较旧的标准,则可以使用fmt库中的fmt::format()替换它。

#include <iostream>
#include <format>

int main() {
    constexpr const char* const a = "This is ";
    constexpr const char* const b = "a test.";

    std::string str = std::format("{}{}", a, b);
    std::cout << str << '\n';
}

从C++17开始应该使用std::string_view而不是c-string-literal。

#include <iostream>
#include <format>
#include <string_view>

int main() {
    constexpr std::string_view a = "This is ";
    constexpr std::string_view b = "a test.";

    std::string str = std::format("{}{}", a, b);
    std::cout << str << '\n';
}

从C++23开始您应该使用std::print()(或std::println())而不是std::cout。它确保您的输出以正确的编码打印。尤其是在Windows CMD中,一旦您偏离ASCII,std::cout就会产生问题。std::print总是正确工作。

#include <print>
#include <string_view>

int main() {
    constexpr std::string_view a = "This is ";
    constexpr std::string_view b = "a test.";

    std::println("{}{}", a, b);
}

相关问题