C++ return 直接来自 operator<<
C++ return directly from operator<<
是否可以在发送到ostream
时直接return?
例如,而不是写:
ostream& operator<<(ostream& os, Foo foo) {
os << foo.a << foo.b;
return os;
}
相反,我可以直接写:
ostream& operator<<(ostream& os, Foo foo) {
return os << foo.a << foo.b;
}
我试过了,似乎可行,但我不知道这样做是否正确。做第二版有问题吗?
Is it allowed to directly return while we are sending to ostream?
是的,允许。
您post的两个代码片段完全等价。
为什么?因为(为了论证,我在这里假设 foo.a
和 foo.b
是像 int
这样的简单数据类型) <<
operator for std::ostream
returns a 对自身的引用(参见链接文档中的“Return 值”部分)。
因此,在您的第一个代码片段中,return os;
行 returns 是对第一个参数引用的 os
对象的引用。在你的第二个片段中,两个 <<
操作每个评估为对同一对象的引用......所以你返回对 完全相同的 对象的引用。
为了使第二个版本更清楚一点,您可能希望将返回的表达式括在括号中:
ostream& operator<<(ostream& os, Foo foo) {
return (os << foo.a << foo.b);
}
是否可以在发送到ostream
时直接return?
例如,而不是写:
ostream& operator<<(ostream& os, Foo foo) {
os << foo.a << foo.b;
return os;
}
相反,我可以直接写:
ostream& operator<<(ostream& os, Foo foo) {
return os << foo.a << foo.b;
}
我试过了,似乎可行,但我不知道这样做是否正确。做第二版有问题吗?
Is it allowed to directly return while we are sending to ostream?
是的,允许。
您post的两个代码片段完全等价。
为什么?因为(为了论证,我在这里假设 foo.a
和 foo.b
是像 int
这样的简单数据类型) <<
operator for std::ostream
returns a 对自身的引用(参见链接文档中的“Return 值”部分)。
因此,在您的第一个代码片段中,return os;
行 returns 是对第一个参数引用的 os
对象的引用。在你的第二个片段中,两个 <<
操作每个评估为对同一对象的引用......所以你返回对 完全相同的 对象的引用。
为了使第二个版本更清楚一点,您可能希望将返回的表达式括在括号中:
ostream& operator<<(ostream& os, Foo foo) {
return (os << foo.a << foo.b);
}