返回对临时c ++的引用

时间:2013-01-18 21:10:20

标签: c++ reference

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));
}

我从第二个函数中的返回值得到此警告:

  

返回临时[默认启用]

的引用

如何解决这个问题?我无法改变每个函数的返回值!

3 个答案:

答案 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]);
}