当不同地使用“ identifier()”时,为什么“ identifier”被认为是歧义的?

时间:2019-03-31 20:28:03

标签: c++

这仅是我碰巧注意到的一个例子!

我将coutoperator<<一起使用,为什么该程序无法编译? 为什么不按函数重载的方式考虑它们?

#include <iostream> // imports the declaration of std::cout

using namespace std; // makes std::cout accessible as "cout"

int cout() // declares our own "cout" function
{
    return 5;
}

int main()
{
    cout << "Hello, world!"; // Compile error!

    return 0;
}

1 个答案:

答案 0 :(得分:3)

在尝试插入流时,在全局范围内有两个名称cout:一个是来自标准库std::cout的名称,该名称由该地标using声明引入了全局范围,以及一个定义为函数int cout()的函数。在表达式中

cout << "Hello, world!\n";

cout的用法不明确。没有函数重载有两个原因:首先,std::cout不是函数,因此不会参与重载。但更根本地讲,在该表达式中使用cout并不是函数调用,因此,再次没有重载。函数定义中的名称cout被视为指向函数的指针,命名空间cout中的名称std是对象的名称。该名称有两种可能的解释,因此它在<<表达式中的使用含糊不清。