char的实现定义是否会影响std :: string?

时间:2016-05-13 15:30:32

标签: c++

除非另有说明,否则我认为所有类型都已签名(如int)。我很惊讶地发现,对于char,它实际上是实现定义的:

  

...实现定义了char对象是否可以容纳   负值。 ......在任何特定的实现中,简单char   object可以采用与signed char或a相同的值   unsigned char;哪一个是实现定义的。

std::string实际上只是std::basic_string<char, ...>

这个程序的语义可以改变实现吗?

#include <string>

int main()
{
    char c = -1;
    std::string s{1, c};
}

1 个答案:

答案 0 :(得分:2)

是和否。

由于std::string包含char类型的对象,因此类型char的签名可能会影响其行为。

您问题中的程序:

#include <string>

int main()
{
    char c = -1;
    std::string s{1, c};
}

没有可见的行为(除非在没有产生任何输出的情况下终止&#34;行为&#34;),所以它的行为并不依赖于普通char的签名。编译器可以合理地优化main的整个主体。 (我承认在这里喋喋不休,评论你选择的代码示例而不是你问的问题。)

但是这个程序:

#include <iostream>
#include <string>

int main() {
    std::string s = "xx";
    s[0] = -1;
    s[1] = +1;
    std::cout << "Plain char is " << (s[0] < s[1] ? "signed" : "unsigned") << "\n";
}

将正确打印Plain char is signedPlain char is unsigned

请注意,使用该类型std::string比较两个operator<对象的类似程序可区分普通char是签名还是未签名,因为<将字符视为未签名,类似于C memcmp的工作方式。

但99%的情况下,这并不重要。您几乎肯定不得不自己编写代码,其行为取决于char的签名。您应该记住它是实现定义的,但如果签名很重要,您应该明确地使用signed char或(更可能)unsigned charchar是一种数字类型,但您应该使用它来保存字符数据。