c++ - 为什么编译器声称此类方法没有返回值?

标签 c++ c++11 enums switch-statement

我从 Eclipse 得到的错误是“没有返回,函数返回非空”。我添加了 default: case 以查看它是否会消除错误,但没有 bean。我认为返回一个右值是可以的,因为它会按值复制到堆栈上,因此当 getLogLevelName() 的局部变量超出范围时,字符串的拷贝将存在。确实,调用代码有效,但错误对我来说很神秘。

std::string bmd2::Logger::getLogLevelName(bmd2::Logger::LogLevel logLevel) throw ()
{
  switch (logLevel)
  {
    case bmd2::Logger::LogLevel::LOG_ERROR:
      return std::string ("ERROR");
      break;
    case bmd2::Logger::LogLevel::LOG_WARNING:
      return std::string ("WARNING");
      break;
    case bmd2::Logger::LogLevel::LOG_INFO:
      return std::string ("INFO");
      break;
    case bmd2::Logger::LogLevel::LOG_DEBUG:
    default:
      return std::string ("DEBUG");
      break;
  }
}

最佳答案

Eclipse 将此报告为错误,因为无论它使用的是什么 C++ 分析工具/库,它都不会推断出 switch 语句中的 default case 实际上是函数的结尾。这应该表现得非常好,即使 Eclipse 另有说明。也许安抚 Eclipse 的更好方法是将默认 return 语句放在 switch 语句之后。

std::string bmd2::Logger::getLogLevelName(bmd2::Logger::LogLevel logLevel) throw ()
{
  switch (logLevel)
  {
    case bmd2::Logger::LogLevel::LOG_ERROR:
      return std::string ("ERROR");
    case bmd2::Logger::LogLevel::LOG_WARNING:
      return std::string ("WARNING");
    case bmd2::Logger::LogLevel::LOG_INFO:
      return std::string ("INFO");
    case bmd2::Logger::LogLevel::LOG_DEBUG:
    default:
      // We will return the default value after the switch statement.
      break;
  }
  // Return default value.
  return std::string ("DEBUG");
}

关于c++ - 为什么编译器声称此类方法没有返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21641827/

相关文章:

c++ - 如何使用 sfinae 选择构造函数?

c++ - 阻止 alt+shift 事件或禁止以编程方式更改语言

c++ - §1.3.7 (N4140) 中是否缺少 `polymorphic` 一词?

python - 在python中使用 "using std::vector"时SWIG参数错误

java - 枚举和android注解intDef

swift - 快速枚举中关联值和原始值之间的区别

.net - 具有多个零值问题的标志枚举(TextFormatFlags)

c++ - 排序数据结构通过迭代器快速迭代、插入、删除

c++ - 将a==b作为参数传递给uniform_real_distribution ok

c++ - 模板类规范的简化