【发布时间】:2019-10-11 22:40:22
【问题描述】:
我有两个版本的函数。一个按值返回,旨在用作 r 值。另一个通过引用返回,旨在用作左值(写入 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;
}
}
为什么编译器在不修改返回引用时选择使用非常量左值覆盖,我该如何防止它这样做?
【问题讨论】: