包含零的字符串初始化 --> 编译器错误或预期行为?

String initialisation containing zero --> compiler bug or intended behavior?

我尝试定义一些硬编码的 utf 序列。

喜欢

    static std::string const cUTF_16_BE_BOM = "\xFE\xFFTest";
    static std::string const cUTF_16_LE_BOM = "\xFF\xFETest";
    static std::string const cUTF_8_BOM     = "\xEF\xBB\xBFTest";
    static std::string const cUTF_32_BE_BOM = "\x00\x00\xFE\xFFTest";
    static std::string const cUTF_32_LE_BOM = "\xFF\xFE\x00\x00Test";
    static std::string const cUTF_7_BOM     = "\x2B\x2F\x76\x38\x2DTest";

但是 cUTF_32_BE_BOM 和 cUTF_32_LE_BOM 在第一种情况下产生空字符串,在第二种情况下产生长度为 2 的字符串。

难道 C++ 字符串不能在知道其实际大小的情况下处理其中的多个 '\0' 字符吗?我希望 strlen 到 return 0 和 2 作为长度或输出流只消耗到第一个 '\0'。但是没有按照写好的代码进行初始化在我看来有点奇怪。

这些将调用带有const char*std::string构造函数:长度已经丢失,调用strlenstd::char_traits<char>::length)的等价物来获取尺码。

通常,您会使用 std::string_literals::operator""s 来不丢失 '[=17=]' 字符,但这在 :: 范围内可能不可行。它看起来像这样:

using namespace std::string_literals;
static std::string const cUTF_32_BE_BOM = "\x00\x00\xFE\xFFTest"s;

您还可以调用带有 const char* 和长度参数的构造函数:

static std::string const cUTF_32_BE_BOM("\x00\x00\xFE\xFFTest", 8);

// Or without hardcoding the size
static std::string const cUTF_32_BE_BOM("\x00\x00\xFE\xFFTest", sizeof("\x00\x00\xFE\xFFTest")-1);

// Or without copying the string
template<std::size_t N>
std::string make_string_from_literal(const char(&s)[N]) {
    return std::string(s, N-1);  // -1 for last '[=11=]' character
}

static std::string const cUTF_32_BE_BOM = make_string_from_literal("\x00\x00\xFE\xFFTest");

isn't a c++ string able to handle multiple '[=10=]' chars in it while knowing its real size?

是的,但您还没有 C++ 字符串。在您提供初始化程序之前问题就出现了。

I would expect a strlen to return 0 and 2 as length or an output stream only to consume until the first '[=11=]'.

那你就知道那是因为 C 字符串就是这样工作的。就像您的代码中的那些一样。 :)

But to be not initialized according to the written code is a bit strange in my perception.

是的。 ;)