看看这个假设的头文件:
template <class T>
class HungryHippo {
public:
void ingest(const T& object);
private:
...
}
现在,HungryHippo<string>您想要ingest引用字符串是有道理的——复制字符串可能非常昂贵!但对于 aHungryHippo<int>来说,它的意义不大。直接传递 anint可能真的很便宜(大多数编译器会在寄存器中这样做),但是传递对 an 的引用int是额外不必要的间接级别。这也适用于返回值。
有没有办法向编译器建议“嘿,我不打算修改参数,所以你决定是通过值还是通过引用传递,这取决于你认为什么更好”?
一些可能相关的事情:
- 我可以通过编写
template <class T, bool PassByValue> class HungryHippo然后专注于PassByValue. 如果我想变得非常花哨,我什至可以PassByValue根据sizeof(T)and来推断std::is_trivially_copyable<T>。无论哪种方式,当实现看起来几乎相同时,这都是很多额外的工作,而且我怀疑编译器可以比我更好地决定是否通过值传递。 libc++项目似乎通过内联许多函数来解决这个问题,因此编译器可以向上一级做出选择,但在这种情况下,假设 的实现正如评论中所解释的,所有模板函数都是ingest相当复杂,不值得内联。inline默认的。