提问人:jemelter 提问时间:3/11/2023 最后编辑:Remy Lebeaujemelter 更新时间:3/15/2023 访问量:84
这个临时的 std::string 表达式可以接受吗?
Is this temporary std::string expression acceptable?
问:
我意识到这不是最有效的做法,但是大多数人是否可以接受 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::string
constexpr
std::string(...)
这在我列出的 Visual C++ 中有效,并且似乎在支持 C++14 的 gcc 版本中编译(需要测试它)。
答:
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::cout
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);
}
评论
std::string(a) + b
std::cout << "*** " << a << b << std::endl;
std::string
std::ostringstream
std::string s2 = (std::ostringstream() << a << b).str(); std::cout << "*** " << s2 << std::endl;
char[]
std::string
char s2[32]; size_t offset = strcpy(s2, a); strcpy(s2+offset, b); std::cout << "*** " << s2<< std::endl;
"This is "s
"a test."s