dci*_*adr 11 c++ reference return-value
可能重复:
警告:返回对临时的引用
我在下面的第二行收到错误"返回临时引用".
class Object : public std::map <ExString, AnotherObject> const {
public:
const AnotherObject& Find (const ExString& string ) const {
Object::const_iterator it = find (string);
if (it == this->end()) { return AnotherObject() };
return ( it->second );
}
}
Run Code Online (Sandbox Code Playgroud)
我的类实现了std :: map.
我是C++的新手,所以我猜它只是一个语法错误.有帮助吗?
zda*_*dan 15
如果您的函数如下所示:
AnotherObject& getAnotherObject()
{
. . .
Object::const_iterator it = find ("lang");
if (it == this->end()) { return AnotherObject() };
. . .
}
Run Code Online (Sandbox Code Playgroud)
问题是,一旦函数退出,你返回的AnotherObject()将被销毁,因此函数的调用者将引用一个伪造的对象.
如果您的函数按值返回:
AnotherObject getAnotherObject()
Run Code Online (Sandbox Code Playgroud)
然后在原件销毁之前制作一份副本,你就可以了.
return AnotherObject();创建一个在函数退出之前被销毁的对象 - 临时对象在包含它们[*]的表达式的末尾被销毁,并且表达式AnotherObject()创建一个临时对象.
由于函数通过引用返回,这意味着调用者甚至有机会看到该引用,它不再引用有效对象.
如果函数是按值返回的,那就可以了,因为临时函数会被复制[**].
[*]有几种情况没有,但他们在这里没有帮助你.
[**]实际上有一个称为"复制构造函数省略"的优化,这意味着不需要创建,复制和销毁临时版本.相反,在一定条件下的编译器被允许只创建副本的目标同样的方式将所创建的暂时的,而不是与临时麻烦的.
您在堆栈上创建一个临时值AnotherObject()并在它被销毁之前将其返回。你的函数的调用者会得到垃圾,所以这是被禁止的。
也许您想在堆上分配它并返回指向它的指针?
return new AnotherObject();
Run Code Online (Sandbox Code Playgroud)
或者,声明您的函数以将“副本”返回到您的对象,而不是像我假设您现在要返回的引用:
AnotherObject f()
{
return AnotherObject(); // return value optimization will kick in anyway!
}
Run Code Online (Sandbox Code Playgroud)