C++:迭代器错误仅适用于两种相同情况之一

问题描述

我使用迭代器以完全相同的方式循环(几乎)相同的字符串对象,而第二个对象不断返回错误。感觉自己很傻,是不是漏了什么东西?

#include <string>
#include <vector>

using namespace std;

struct Sentence
{
  string text;
  Sentence(const string& text)
      : text{text}
  {
    for (string::const_iterator it = text.cbegin(); it != text.cend(); ++it)
    {
      // Actions: WORKS FINE:
    }
  }

  string str() const
  {
    for (string::const_iterator it = text.cbegin(); it != text.cend(); ++it)
    {
      // Actions: RETURNS ERROR: Process finished with exit code 132 (interrupted by signal 4: SIGILL)
    }
  }
};

int main()
{
  vector<Sentence> vec;
  vec.push_back(Sentence{""});
  vec[0].str();
  return 0;
}

解决方法

  string str() const

正如您在此处看到的,您的 str() 被声明为返回 std::string,但实际代码并没有 return 任何内容。

这被称为“未定义的行为”,从现在开始你不能期待任何有意义的结果。

您需要修复此 str() 方法,使其正确声明为返回 void,或实际返回 std::string

所有现代 C++ 编译器都会发出有关此常见错误的警告或诊断消息。如果您的编译器在编译代码时产生警告消息,这将是不忽略来自编译器的任何 类型消息的示例。如果您没有从编译器收到任何消息,请检查其设置和命令行选项,并打开所有警告消息,或升级您的编译器。