概述
#include <iostream>
#include <windows.h>
using namespace std;
class A
{
public:
A(){ m_Int = 10; }
public:
int m_Int;
};
A GetInt()
{
A a;
return a;
}
int Test( const A& pA )
{
cout << pA.m_Int << endl; // 还会输出10
return 4;
}
char Test1( const A& pA )
{
cout << pA.m_Int << endl; // 还会输出10
return 'n';
}
int main()
{
A& pA = GetInt();
// GetInt返回一个临时对象 类似返回int时用eax传
// 在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型引用,这是非法的。
// dev-c++编译不过,但是vs可以通过,可能vs进行了优化,不能声明一个临时对象的非const引用,应该改为const A& pA = GetInt();
const A& pB = GetInt();// 正确的写法,但是毕竟返回的是临时对象,若该临时对象释放了,该引用不是失效了吗?
cout << pA.m_Int << endl;
// 可以输出10,可能是因为临时对象没有释放。
Test( GetInt() ); // 这里传递一个临时变量给Test函数,其中参数必须为const类型,否则dev-C++编译不过,但vs编译通过,可能vs进行了优化。
cout << sizeof Test1(A()) << endl; //进行预处理,编译时已经知道结果了,运行时不会再调用Test1函数
//因为Test1返回char,所以sizeof Test1(A()) 为1,编译时已经知道了
Sleep(10000);
cout << pA.m_Int << endl;
// 还是会输出10
system("pause");
return 1;
}
总结(转载的):
string foo( ); // 凡是返回值对象都是临时对象?
void bar(string & s);
那么下面的表达式将是非法的:
bar(foo( ));
bar("hello world");
原因在于foo( )和"hello world"串都会产生一个临时对象,而在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。引用型参数应该在能被定义为const的情况下,尽量定义为const 。
最后
以上就是缥缈楼房为你收集整理的函数返回的临时对象为const类型,const引用的全部内容,希望文章能够帮你解决函数返回的临时对象为const类型,const引用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复