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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |