为什么enum隐式地转换为std::string ?

Why does an enum implicitly convert to a std::string?

本文关键字:std string 转换 enum 为什么      更新时间:2023-10-16

抱歉,如果这已经问过之前,或者如果我做错了我的代码,但我刚刚遇到了一个错误,我正在分配一个错误的变量,它煮沸做这个例子:

#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 ("%sn", s.c_str());
  return 0;
}

请注意,在if/else if语句中,我分配给变量s(实际的例子是将"mode"转换为"mode_",其中一个是字符串,一个是enum,我在一个情况下省略了下划线。

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

我觉得我错过了什么,还是我的编译器出了问题?标准中有关于这方面的规定吗?

标准库包含原型

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 ("%sn", s.c_str());
  return 0;
}

您不是在比较字符串和enum,而是在比较两个字符串。

然而,您正在将枚举值赋给字符串。在这里,枚举值(隐式整数)被编译器隐式转换为char,然后可以将其赋值给std::string。