关于 return 和参数类型的困惑

Confusion about return and parameter types

我真的是 c++ 的新手,刚刚尝试了一些代码,但有些东西我似乎并没有真正理解:

 #include<iostream>
 using namespace std;

int f (const long& i) {
    return i+1;
}

void g (long& i) {
    f (i);
}

int main () {
    long la = 0;
    int a = 0;

    int b = f (a);
    long c = f (7);
    la = f (la); 
    cout << "la = " << la << " a = " << a << endl;
    cout << "b = " << b << " c = " << c << endl;
}

所以我不明白的是:为什么函数 f 接受 int 类型的变量? a 显然不是 long,但它仍然接受它。我不明白。另外,由于 f 的 return 类型是 int,它会自动将 return 结果从 long 转换为 int 吗?我真的不明白这里发生了什么。

C++ 允许某些类型之间的隐式转换。所有数字 built-in 类型都可以相互转换,因此编译器可以自由地在 int/long/short/long long 和它们的无符号等价物之间进行任何转换。有关类型转换的详细信息,请参阅 cppreference

参数使用了so-called通常的算术转换。类型 int 的对象隐式转换为类型 long,因为类型 long 的等级高于类型 int 的等级。即 long 类型的对象可以容纳 int.

类型的任何值

至于 return 类型则可以获得无效结果,因为类型 int 的对象不一定可以容纳类型 long 的值.

请注意,如果您不希望该函数接受一个 int 类型的对象作为参数,您可以使用 int 类型的参数定义相应的函数作为删除。

例如

#include <iostream>

int f (const long& i) {
    return i+1;
}

int f( const int & ) = delete;

int main() 
{
    int a = 0;

    f( a );

    return 0;
}

程序编译不通过,因为int类型参数的函数被定义为删除