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

Is this temporary std::string expression acceptable?

提问人:jemelter 提问时间:3/11/2023 最后编辑:Remy Lebeaujemelter 更新时间:3/15/2023 访问量:84

问:

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

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::stringconstexprstd::string(...)

这在我列出的 Visual C++ 中有效,并且似乎在支持 C++14 的 gcc 版本中编译(需要测试它)。

C 可视化 C++ C ++14 stdstring 临时对象

评论

0赞 Igor Tandetnik 3/11/2023
如果我要查看此代码,它不会真正打扰我;特别是如果它不在性能敏感的路径上。您可以保存一个堆分配和一些键入(除了在您的示例中,字符串太短,可能会启动小字符串优化)。std::string(a) + b
0赞 Remy Lebeau 3/11/2023
可以接受吗?当然,为什么不呢?它有效吗?不一定。但在这个特定的例子中,改用它会好得多。如果你真的想避免连接s,你可以使用一个,例如: 或者(喘息)一个,例如(无论如何,一个在内部都会这样做):std::cout << "*** " << a << b << std::endl;std::stringstd::ostringstreamstd::string s2 = (std::ostringstream() << a << b).str(); std::cout << "*** " << s2 << std::endl;char[]std::stringchar s2[32]; size_t offset = strcpy(s2, a); strcpy(s2+offset, b); std::cout << "*** " << s2<< std::endl;
0赞 j6t 3/11/2023
字符串 UDL 有时可能为 adaquate: 和 。"This is "s"a test."s

答:

0赞 Benjamin Buch 3/15/2023 #1

这是一个有效但效率低下且略显缺乏吸引力的解决方案。请注意,将第一个操作数转换为 .这效率略高。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-literals。

#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::p rint() (或 std::p rintln( 而不是 .它确保您的输出以正确的编码打印。特别是在 Windows 中,一旦您偏离 ASCII,CMD 就会引起问题。 始终正常工作。std::coutstd::coutstd::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);
}