我制作了这个c ++代码:
std::string const & Operand::toString() const
{
std::ostringstream convert;
convert << this->value;
return convert.str();
}
编译器告诉我:returning reference to temporary
我是否被迫将convert.str()
放入Operand
班级?
答案 0 :(得分:5)
convert.str();
这将返回一个std::string
对象,该对象将在Operand::toString()
返回后被销毁。因此,这是临时变量,其寿命仅限于此函数的范围。您应该只返回string
本身,按值:
std::string Operand::toString() const
{
std::ostringstream convert;
convert << this->value;
return convert.str();
}
或:
const std::string Operand::toString() const
{
std::ostringstream convert;
convert << this->value;
return convert.str();
}
答案 1 :(得分:4)
只需更改功能即可返回std::string
而不是std::string const &
。你想在这里按价值返回。
答案 2 :(得分:1)
只需删除&
和const
即
std::string Operand::toString() const
{
std::ostringstream convert;
convert << this->value;
return convert.str();
}
答案 3 :(得分:0)
如果您无法更改原型 - 它必须返回引用而不是字符串本身 - 您必须将字符串保留在某处并返回对它的引用。也许创建一个静态字符串,为其分配convert.str()
并返回对此静态字符串的引用。
std::string const & Operand::toString() const
{
static std::string s;
std::ostringstream convert;
convert << this->value;
s = convert.str();
return s;
}
David Schwartz在评论中建议使用另一种解决方案(在不同答案中),但这取决于您是否可以将该成员字符串添加到Operand
。