为什么枚举隐式转换为std :: string?

时间:2014-05-29 00:43:30

标签: c++ enums

很抱歉,如果之前有人询问过,或者我的代码中有错误,但我刚刚遇到了一个错误,我在分配一个错误的变量,并且在这个例子中很简单:

#include <string>

enum Enum {
  A, B, C
};

int main() {
  std::string s = "A";

  if (s == "A")
    s = A;
  else if (s == "B")
    s = B;
  else if (s == "C")
    s = C;

  printf ("%s\n", s.c_str());
  return 0;
}

请注意,在if / else if语句中,我分配给变量s(实际示例是将&#34; mode&#34;转换为&#34; mode _&#34;其中一个是字符串,一个是枚举,我在一个案例中留下了下划线。

我的问题是,为什么编译器没有抱怨?即使使用-Wall和-W,它也会默默成功。

我觉得我错过了某些东西,或者我的编译器出了什么问题?标准中有什么内容吗?

2 个答案:

答案 0 :(得分:4)

标准库包含原型

basic_string& operator=(charT c);

表示您可以将单个字符分配给字符串:

s = 'A';

但是单个字符只是一个小整数,不是吗?

您可以使用C ++ 11样式的范围枚举器来避免此问题。以下将产生预期的编译器错误:

#include <string>

enum class Enum {
    A, B, C
};

int main() {
  std::string s = "A";

  if (s == "A")
    s = Enum::A;
  else if (s == "B")
    s = Enum::B;
  else if (s == "C")
    s = Enum::C;

  printf ("%s\n", s.c_str());
  return 0;
}

答案 1 :(得分:2)

您没有将字符串与枚举进行比较,而是在比较两个字符串。

但是,您要为字符串分配枚举值。这里枚举值(隐式为整数)由编译器隐式转换为char,然后可以将其赋值给std :: string。