类型检查是否与返回以及作为争论传递时不同

时间:2016-04-06 10:43:40

标签: c++ typechecking

我和我的朋友正在尝试两个程序,第一个是int&返回,第二个是int&通过。

计划1:

#include<iostream>
using namespace std;
int& fun(int x)
{
    static int y=x;
    cout<<"Inside Fun()"<<y<<endl;
    return y;
}
int main()
{
    cout<<(fun(10)=30)<<endl;
    cout<<fun(40)<<endl;
    return 0;
}

就像一个魅力......

而计划2

#include<iostream>
using namespace std;
int& fun(int &x)
{
    static int y=x;
    cout<<"Inside Fun()"<<y<<endl;
    return y;
}
int main()
{
    cout<<(fun(10)=30)<<endl;
    cout<<fun(40)<<endl;
    return 0;
}

给出错误

return.cc: In function 'int main()':
return.cc:11: error: invalid initialization of non-const reference of type 'int&' from a temporary of type 'int'
return.cc:3: error: in passing argument 1 of 'int& fun(int&)'
return.cc:12: error: invalid initialization of non-const reference of type 'int&' from a temporary of type 'int'
return.cc:3: error: in passing argument 1 of 'int& fun(int&)'

在第一个程序中,允许fun ::&amp; x = 30作为回报。而在程序2中,不允许int&amp; x = 10。我怀疑的是,与返回类型相比,是否在C ++中对函数参数进行了更严格的类型检查,为什么&amp; x = 10无效作为函数参数。

4 个答案:

答案 0 :(得分:3)

引用不能绑定到临时或文字值,例如文字整数值10

如果你想要一个引用并将它绑定到临时值或文字值,你需要使用对常量的引用,即int const&

您不需要在第二个程序中返回对常量的引用,因为您没有返回对临时值或文字值的引用,而是返回对实际变量的引用,该变量的生命周期为该计划的有效期。

例如:

int val = 10;
int& ref = fun(val);

在上面的代码中,变量ref实际上是对函数y内的静态局部变量fun的引用。

答案 1 :(得分:1)

你无法将10转换为int&amp;因为它的字面值。 它与返回类型无关,它是您理解参数的根本缺陷。您可以将参数设为const int&amp;然后那就行了。

答案 2 :(得分:1)

你遇到的问题不在于返回的int&amp;但是使用int&amp;在你的参数。参考类型int&amp;当你试图将一个文字int传递给它时,它是一个可变的引用,它显然不会被突变。

答案 3 :(得分:0)

传值将创建传递对象的副本,期望该副本将在函数调用结束时消失。

传递引用将传递实际对象,您将被允许改变它。因为您传递的是文字(10),所以不能改变它,因此您需要传递const引用。