参考变量上的C ++运算符,这有什么作用?

时间:2016-12-29 16:49:24

标签: c++

我遇到了一个类,其成员var作为引用(到std :: istream),运算符void *()和bool运算符!()返回该引用,我想知道它会是什么对于。该类与使用config参数对读取/解析文本文件有关。我从(更大)更大的项目中撤出了基本部分。在qt(MSVC 2015社区工具链)中,我不得不更改operator void *()以获得编译,但在原始linux系统上似乎没问题。

(在我的桌面环境中,我得到:“错误:C2440:'返回':无法从'std :: istream'转换为'void *'”,所以我替换为调用if(m_in.eof())和{ {1}})

return nullptr

以及使用它的类:

class LR { // (line reader)
public:
  LR(const std::string &filename);

  .... other stuff

  operator void *() const { return &m_in; }
  bool operator !() { return !m_in; }
  LR & operator>>(std::string &line);

private:
  std::istream &m_in; // input stream
  std::ifstream m_in_file; // input file (if specified)

}; 
LR::LR(const std::string &filename, ... other stuff) :
   : m_in(m_in_file)
{
   //  .... other stuff
  if(filename.size() > 0)
  {
    m_in_file.open(filename.c_str());
  }
   // .... other stuff
}

在Qt中调试,class CR { // config reader public: // .... other stuff void Load_Variable(const std::string &section, value, etc...); private: LR m_reader; }; void CR::Load_Variable(const std::string &section, value, etc.) { string line; bool found = false; while (m_reader >> line) { // .... check stuff, etc. } } 调用操作符void *()。
我的问题:
为什么要像这样使用while (m_reader >> line)的成员var引用?
当成员var std::istream的地址始终有效时,返回成员var &m_in的地址的目的是什么,因为它是成员var(或者这不是真的?)
m_reader的operator *()会返回false吗?我在网上搜索了一下,并没有在成员var refs上找到任何类似的运算符使用的类似例子。当文件打开失败时,我需要查看它的作用 可能这段代码最初使用堆指针变量或其他方法用于m_in var并且它在某处改变为正常成员var,然后运算符编辑到此?我认为历史不容易得到。
感谢您的帮助,stackoverflow非常棒。

1 个答案:

答案 0 :(得分:0)

istream有一个标志,指示是否发生了错误,它会覆盖!操作员方便访问。你会经常看到它像这样使用:

myStream >> line;
if(!myStream)
   cout<<"Error reading data"<<endl;

所以你没有返回引用,你返回一个布尔标志。想想!运算符为isNoError()访问者。

你的类正在做同样的事情,只是从它包装的流中传递结果。

*运算符可能作为向后兼容性度量。可能现有的代码库期望一个指针,并且这是添加的,以便现有的代码库与新的实现一起使用。