首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“cout << x”和“`cout.operator<<(X)”和“运算符”之间的区别(std::cout,x)?

“cout << x”和“`cout.operator<<(X)”和“运算符”之间的区别(std::cout,x)?
EN

Stack Overflow用户
提问于 2014-01-02 17:12:23
回答 3查看 913关注 0票数 0

这与difference-between-cout-x-and-cout-operator-x的问题有关,但还是有点不同.

代码语言:javascript
复制
#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’却不能工作。相反,编译器抛出一个错误:

代码语言:javascript
复制
main.cpp:10:4: error: no matching function for call to 'operator<<'
    operator<<(std::cout, std::endl);

Q3:如何用operator<<(...)形式编写第一个std::cout << "hello1" << std::endl;

如果前两个问题已经得到回答,那么这可能已经包括在内了。这是这个学习练习的意义,所以明确地问它似乎是明智的。

EN

回答 3

Stack Overflow用户

发布于 2014-01-02 17:20:40

一些重载的operator<<是类成员,另一些则不是。

在C++03中,这造成了一些令人困惑的调用场景,因为对非const(非成员的参数)的引用不能绑定到rvalue,但是在C++11中,至少有一个这样的引用通过引入rvalue引用参数重载而被修复。

因此,什么调用编译或不调用通常也更依赖于C++标准版本,即C++03或C++11。

票数 1
EN

Stack Overflow用户

发布于 2014-01-02 17:21:25

std::ostream中定义了一组成员输出操作符。回想起来,这可能是一个错误,但当IOStreams第一次创建时,我认为它实际上是必要的。这些成员操作符包括重载、接受函数指针,这意味着您需要使用成员表示法。使用C-字符串的操作符是非成员重载,也就是说,您需要使用非成员函数调用表示法来获得C-字符串重载。当使用char const*调用成员运算符时,char const*将转换为有成员输出运算符的void const*

票数 1
EN

Stack Overflow用户

发布于 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‘都是一个显式的成员函数调用。

  • Q1是operator<<成员(const*)
  • Q2没有接受函数的成员
  • Q3是不可能的
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20888009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档