У меня есть две версии функции. Один возвращает по значению, предназначенному для использования в качестве r-значения. Другой возвращает по ссылке, предназначенный для использования в качестве l-значения (для записи в вектор audio_data).
float AudioData::sample(unsigned frame, unsigned channel) const
{
return audio_data[frame * channel_count + channel];
}
float& AudioData::sample(unsigned frame, unsigned channel)
{
clearSplits(); // Clear out cached information that may be invalidated by this call
return audio_data[frame * channel_count + channel];
}
Во время отладки я заметил, что переопределение возврата ссылки используется какr-значение:
const float *AudioData::split(unsigned channel)
{
if (splits[channel] != nullptr) return splits[channel];
if (channel_count == 1) return data();
float *split = new float[frame_count];
for (unsigned i = 0; i < frame_count; ++i)
{
split[i] = sample(i, channel); // Calls the reference-returning override
}
splits[channel] = split;
return split;
}
void AudioData::clearSplits() // This gets called while writing to the splits!
{
for (unsigned i = 0; i < splits.size(); ++i)
{
if (splits[i] != nullptr) delete[] splits[i];
splits[i] = nullptr;
}
}
Почему компилятор предпочитает использовать неконстантное переопределение l-значения, когда он не изменяет ссылку возврата, и как я могу предотвратить это?