SongPart mtm::SongStructure::getPart(int index) const {
assert(index >= 0 && index < num_of_parts);
return song_parts[index];
}
const SongPart& mtm::Song::operator[](int index) const {
assert(index >= 0 && index < song_length);
return (song_format->getPart(index));
}
我从第二个函数中的返回值得到此警告:
返回临时[默认启用]
的引用
如何解决这个问题?我无法改变每个函数的返回值!
答案 0 :(得分:4)
您收到警告,因为getPart
会返回song_parts[index]
的副本。如果它将引用返回到song_parts[index]
,那么您的代码就是正确的。
因此,您需要将getPart
的返回类型更改为SongPart const&
:
SongPart const & mtm::SongStructure::getPart(int index) const {
assert(index >= 0 && index < num_of_parts);
return song_parts[index];
}
const
是必需的,因为该函数是const
成员函数。
为什么在将assert
的呼叫转发到operator[]
时,也会在getPart
中使用const SongPart& mtm::Song::operator[](int index) const {
//assert(index >= 0 && index < song_length); not needed!
return (song_format->getPart(index));
}
?写下这个:
{{1}}
在不需要时避免额外的绑定检查。
答案 1 :(得分:2)
将第一个函数更改为:
const SongPart& mtm::SongStructure::getPart(int index) const {
assert(index >= 0 && index < num_of_parts);
return song_parts[index];
}
原因是对值返回song_format->getPart(index)
的调用,从而在第二个函数的堆栈上创建一个本地。如果你返回对它的引用,在第二个函数返回后,Boom ....
答案 2 :(得分:1)
如果您无法更改getPart()
的返回类型,则无法有效地调用它。让我们考虑如何在不调用getPart()
的情况下访问数据。
解决方案1:调用一些其他功能:
const SongPart& mtm::SongStructure::getPartReference(int index) const {
assert(index >= 0 && index < num_of_parts);
return song_parts[index];
}
const SongPart& mtm::Song::operator[](int index) const {
assert(index >= 0 && index < song_length);
return (song_format->getPartReference(index));
}
解决方案#2:直接从song_parts[index]
返回operator[]
:
const SongPart& mtm::Song::operator[](int index) const {
assert(index >= 0 && index < song_length);
return (song_format->song_parts[index]);
}