这与difference-between-cout-x-and-cout-operator-x的问题有关,但还是有点不同.
#include <iostream>
int main(){
std::cout << "hello" << std::endl;
std::cout.operator<<("hello2");
std::cout.operator<<(std::endl);
operator<<(std::cout, "hello3");
// operator<<(std::cout, std::endl);
return 0;
}Q1:为什么std::cout.operator<<("hello2");要工作?
从other answers开始,所以我希望编译器会抱怨,因为operator<<是一个免费的函数,而不是cout的成员。然而,在我的系统中,它打印"0x10d54df31“。而且,更奇怪的是,下面的行正确地执行了std::endl。
Q2:为什么operator<<(std::cout, std::endl);不能工作?
我知道std::endl是一个函数,但在我看来,奇怪的是,hello3输出工作,而‘`std::endl’却不能工作。相反,编译器抛出一个错误:
main.cpp:10:4: error: no matching function for call to 'operator<<'
operator<<(std::cout, std::endl);Q3:如何用operator<<(...)形式编写第一个std::cout << "hello1" << std::endl;?
如果前两个问题已经得到回答,那么这可能已经包括在内了。这是这个学习练习的意义,所以明确地问它似乎是明智的。
发布于 2014-01-02 17:20:40
一些重载的operator<<是类成员,另一些则不是。
在C++03中,这造成了一些令人困惑的调用场景,因为对非const(非成员的参数)的引用不能绑定到rvalue,但是在C++11中,至少有一个这样的引用通过引入rvalue引用参数重载而被修复。
因此,什么调用编译或不调用通常也更依赖于C++标准版本,即C++03或C++11。
发布于 2014-01-02 17:21:25
在std::ostream中定义了一组成员输出操作符。回想起来,这可能是一个错误,但当IOStreams第一次创建时,我认为它实际上是必要的。这些成员操作符包括重载、接受函数指针,这意味着您需要使用成员表示法。使用C-字符串的操作符是非成员重载,也就是说,您需要使用非成员函数调用表示法来获得C-字符串重载。当使用char const*调用成员运算符时,char const*将转换为有成员输出运算符的void const*。
发布于 2014-01-02 17:41:53
您的问题可以细分为成员功能,非会员功能。
有13.5.2二进制运算符
二进制操作符应由具有一个参数的非静态成员函数(9.3)或由具有两个参数的非成员函数实现。因此,对于任何二进制运算符@,x@y都可以解释为x.operator@(y)或运算符@(x,y)。如果已声明了这两种形式的运算符函数,则13.3.1.2中的规则确定使用哪种解释。
省略13.3.1.2的引号,成员函数(运算符)是首选。
行'std::cout << "hello“<< std::endl;‘包含非成员函数。每个'std::cout.operator‘都是一个显式的成员函数调用。
https://stackoverflow.com/questions/20888009
复制相似问题