C++ 持有函数返回对象值的引用/指针合法吗?
按值传递函数的返回对象合法吗? 我有一个来自C++ 持有函数返回对象值的引用/指针合法吗?,c++,C++,按值传递函数的返回对象合法吗? 我有一个来自a::getA()的函数,它按值返回一个对象。 在同一行中引用此值是否合法,请参见第行 b.processA(a.getA()) 请参阅下面我的代码: class A { public: int a; std::list<int*> m_list; A(int a) { this->a =a; } A(A& _a) { this->
a::getA()
的函数,它按值返回一个对象。
在同一行中引用此值是否合法,请参见第行
b.processA(a.getA())代码>
请参阅下面我的代码:
class A
{
public:
int a;
std::list<int*> m_list;
A(int a)
{
this->a =a;
}
A(A& _a)
{
this->a =_a.a;
m_list.push_back(&a);
}
A getA()
{
A localA(20);
localA.m_list.push_back(&localA.a);
return localA;
}
};
class B
{
public:
char b;
B(char b)
{
}
void processA(A& a)
{
a.a = 1;
processA2(a);
}
void processA2(A& a)
{
a.a = 2;
}
};
void main()
{
B b('a');
A a(11111);
//************
// IS THE FOLLOWING LINE LEGAL??
// I mean, is it legal to pass the return object of the function by value
//************
b.processA(a.getA());
}
A类
{
公众:
INTA;
std::列表m_列表;
A(INTA)
{
这->a=a;
}
A(A&_A)
{
这->a=\u a.a;
m_列表。推回(&a);
}
A getA()
{
A localA(20);
localA.m_list.push_back(&localA.a);
返回localA;
}
};
B类
{
公众:
字符b;
B(字符B)
{
}
无效流程A(A&A)
{
a、 a=1;
程序A2(a);
}
无效流程A2(A&A)
{
a、 a=2;
}
};
void main()
{
B(“a”);
A(11111);
//************
//下面这句话合法吗??
//我的意思是,通过值传递函数的返回对象合法吗
//************
b、 processA(a.getA());
}
不,它甚至不会编译。原因是a.getA()
返回一个临时对象,该对象不能绑定到非常量引用类型
但是,如果将参数const reference设置为:
void processA(A const & a)
那就好了
注意:MSVC++将临时对象绑定到非常量引用作为扩展。这不是标准
不,它甚至不会编译。原因是a.getA()
返回一个临时对象,该对象不能绑定到非常量引用类型
但是,如果将参数const reference设置为:
void processA(A const & a)
那就好了
注意:MSVC++将临时对象绑定到非常量引用作为扩展。它不是标准的。所以基本上你是在问:
X f();
void g(X& x);
g(f());
是否合法
作为安全预防措施,非成本引用不能绑定到临时引用。因此,上述规定是不合法的
但是,以下内容是合法的:
X f();
void g(const X& x);
g(f());
临时部队将一直生存到g回来
第一个版本是llegal的原因是因为g所做的任何更改都将被丢弃,所以为什么要这样做呢?它很可能表示一个逻辑错误,因此作为一个语言设计决策,它是一个编译时错误。所以基本上你是在问:
X f();
void g(X& x);
g(f());
是否合法
作为安全预防措施,非成本引用不能绑定到临时引用。因此,上述规定是不合法的
但是,以下内容是合法的:
X f();
void g(const X& x);
g(f());
临时部队将一直生存到g回来
第一个版本是llegal的原因是因为g所做的任何更改都将被丢弃,所以为什么要这样做呢?它很可能表示逻辑错误,因此作为语言设计决策,它是编译时错误。关于为什么void main
的链接不好:使用void main()
是不合法的;您必须使用int main()
或int main(int-argc,char**argv)
。根据哪个州的法律,这是非法的?:-)关于为什么void main
不好的链接:使用void main()
是不合法的;您必须使用int main()
或int main(int-argc,char**argv)
。根据哪个州的法律,这是非法的?:-)但是请注意,代码有更多的问题(getA
间接创建指向过时对象的指针)@bochaltura MSVS有一个扩展,允许您绑定到非常量引用。如果你关闭语言扩展,你会得到一个错误。@ BoChutura:这是一个MSVC扩展到C++语言。@ BoCurTura:在我的答案中读注释。我猜想,重复。但是,代码有更多的问题(<代码> GETA <代码>间接地创建一个指向过时对象的指针)。@bochaltura MSVS有一个扩展,允许您绑定到非常量引用。如果你关闭语言扩展,你会得到一个错误。@ BoChutura:这是一个MSVC的扩展到C++语言。@博查图拉:读我的答案中的注释。