关于返回和参数类型的困惑

时间:2018-03-25 12:15:18

标签: c++ type-conversion long-integer implicit-conversion return-type

我对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显然不是很长,但它仍然接受它。我不明白。另外,由于f的返回类型是int,它是否会自动将返回结果从long转换为int?我真的不明白这里发生了什么。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

对于参数,使用了所谓的通常的算术转换int类型的对象被隐式转换为类型long,因为类型long的排名大于类型int的排名。这是long类型的对象可以容纳int类型的任何值。

对于返回类型,可以获得无效结果,因为类型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类型参数的函数被定义为已删除。