1

我在 Bruce Eckel 的 Thinking in C++ 中读到,当 C++ 编译器遇到一个函数时,它会使用它的名称和参数来装饰它的名称。对于函数,int func(char ch); 它会将其名称装饰为 _func_char 它不使用返回类型。

在这种情况下,在下面的程序中,当编译器在函数名修饰期间没有存储返回类型时,它如何抱怨“从 int 到 const char* 的无效转换”?谁能澄清一下?

#include <iostream>

using namespace std;

int func()
{
    int i = 5;
    return i;
}

int main()
{
    string str = func();
}
4

2 回答 2

5

符号(不仅仅是函数)名称修饰在链接阶段发挥作用。你得到一个编译器错误。

编译器看不到损坏的名称。它只是看到你有一个调用的函数func,它返回一个int并且不接受任何参数,因此可以告诉你你的代码是非法的。

于 2012-05-29T09:03:14.717 回答
5

这是一个编译错误。
编译器根据 C++ 标准规范检查 C++ 程序的有效性。

为什么编译器会在这里报错?

因为编译器可以看到函数的返回类型是int并且它被用于初始化该类型的变量std::string并且没有有效的隐式转换。

请注意,该语言的设计方式允许编译器进行此类类型检查,C++ 是一种静态类型语言

于 2012-05-29T09:03:22.410 回答