operator<< stackoverflow

operator<< stackoverflow

本文关键字:lt stackoverflow operator      更新时间:2023-10-16

考虑以下代码:

class TextMessage{
public :
    TextMessage(){};
    TextMessage(std::string _text):text(_text){}
    std::string text;
    friend std::ostream & operator<<( std::ostream & os, const TextMessage & m);
};
std::ostream & operator<<( std::ostream & os, const TextMessage & m){
    return os << "text message : " << m.text;
}

为什么:

  • Visual 2010是否在操作员<<中发出C4717警告
  • std::cout << textMsgInstance;是否如Visual预测的那样通过stackoverflow崩溃

顺便说一下,用m.text.c_str()代替m.text是可行的。

我猜您#include <string>失败了。因此,当编译器输出std::string时,它不能,并开始寻找隐式转换——而TextMessage的隐式构造函数看起来就像是账单。但是等一下,现在我们在TextMessage的输出函数中输出一个TextMessage,然后bam。

我唯一能想到的是它没有运算符<lt;对于std::string,它查找转换并找到单参数构造函数TextMessage(std::字符串)。

通常建议通过显式调用单参数构造函数来防止意外调用。

explicit TextMessage(std::string _text):text(_text){}

然后它将不考虑隐式转换的构造函数。

这是因为m.textstd::string,它在运算符内部转换为TextMessage,然后再次调用运算符。