加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为什么写入临时流失败?

发布时间:2020-12-16 04:52:51 所属栏目:百科 来源:网络整理
导读:请考虑以下代码: #include sstream#include iostreamclass Foo : public std::stringstream {public: ~Foo() { std::cout str(); }};int main(){ Foo foo; foo "Test1" std::endl; Foo() "Test2" std::endl; return 0;} 当我执行此操作时,它给了我: 004177
请考虑以下代码:
#include <sstream>
#include <iostream>

class Foo : public std::stringstream {
public:
    ~Foo() { std::cout << str(); }
};

int main()
{
    Foo foo;
    foo << "Test1" << std::endl;

    Foo() << "Test2" << std::endl;

    return 0;
}

当我执行此操作时,它给了我:

004177FC
Test1

我不明白为什么第二个例子给我带来胡言乱语.临时应该存在直到整个表达式被评估,那么为什么它与第一个例子的行为不一样?

解决方法

我测试了它.

我可以猜到那个运算符<<不能将临时绑定到非const引用,因此任何外部定义的运算符<<函数将无法在Foo临时函数上运行,但是如果ostream或ostringstream具有任何内部运算符<<成员他们会工作. 因此,指针的重载可能是成员函数,而const char *的特殊函数是外部声明的. 非临时可以绑定到非const引用以获得更专业的重载. 如果你真的需要这个,你可以使用包装器解决

class Foo :
{
    mutable std::ostringstream oss;
public:
  ~Foo()
  {
    std::cout << oss.str();
  }

  template<typename T>
  std::ostream&
  operator<<( const T& t ) const
  {
      return oss << t;
  }
};

经过测试和工作.第一个运算符<<将返回您的基础流. 我也尝试了这个但是它已经减少了:

class Foo : std::ostringstream
{
    Foo & nonconstref;
public:
   Foo() : nonconstref( *this ) {}
  ~Foo()
  {
    std::cout << str();
  }

  template<typename T>
  std::ostream&
  operator<<( const T& t ) const
  {
      return nonconstref << t;
  }
};

这也有效:

class Foo : public std::ostringstream
{
public:
   Foo()  {}
  ~Foo()
  {
    std::cout << str();
  }

  Foo& ncref()
  {
       return *this;
  }
};

int main()
{
    Foo foo;
    foo << "Test1" << std::endl;

    Foo().ncref() << "Test2" << std::endl;

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读