我一直在阅读有关运算符重载的信息,并且了解到,如果您从函数返回引用,则可以级联重载的运算符。
我的问题是这个。为了返回引用,您是否需要将引用传递给函数,或者值会传递?
例如都有效吗?
ostream &operator<<(ostream output, string &label);
和
ostream &operator<<(ostream &output, string &label);
第一个还会返回对传递给函数的输出流参数的有效引用吗,还是您需要传入输出流对象作为引用以将其作为引用返回?
答案 0 :(得分:1)
您不能使用
std::ostream &operator<<(std::ostream output, std::string &label);
因为std::ostream
没有副本构造函数。
即使std::ostream
具有复制构造函数,使用上述接口也会导致以下问题。
返回对输入参数的引用将是一个问题。函数返回后,该对象将不活动。因此,一旦函数返回,返回的引用将是悬空引用。使用悬空参考会导致不确定的行为。
这是假设。
想象一下如果您使用以下内容会发生什么情况:
std::ofstream outfile("myoutput.txt");
outfile << "A string.";
该调用将导致对象切片。您将失去对象的std::ofstream
-性。输出将在该函数中输出到哪里?当然不会进入文件。
与
粘在一起std::ostream &operator<<(std::ostream &output, std::string const& label);
PS 是,我确实将第二个参数的类型更改为const&
。