传递引用函数通常如何区别于传值函数?例如:
template <typename T>
void sort(std::vector<T>& source); // Sorts source.
// Versus...
template <typename T>
std::vector<T> sort(std::vector<T> source); // Returns a sorted copy of source.
这两个功能含糊不清;其中一个必须重命名或完全删除。
如何避免这种情况?一种形式应该优先于另一种吗?或者是否有任何共同的命名准则来区分它们?
答案 0 :(得分:6)
难道你不能给他们不同的名字吗?我会将功能版本命名为sorted
,例如。
仅仅因为你可以重载函数(或者在这种情况下是函数模板)并不意味着你拥有。
顺便说一句,你可以用“命令式版本”来实现“功能版本”:
template <typename T>
void sort(std::vector<T>& source)
{
// sort in place
}
template <typename T>
std::vector<T> sorted(std::vector<T> copy)
{
sort(copy);
return copy;
}
答案 1 :(得分:2)
答案 2 :(得分:0)
通常情况下,如果可能,最好不要传递非const引用,并使用第二种形式。这是因为首先,如果你想将返回值传递给另一个函数,第二个排序会更好,其次,因为编译器的优化器在大多数情况下会处理不必要的复制,第三个因为有一个引用可以防止任何类型的TMP检测到它实际上是一个返回值的事实,并阻止在任何类型的函数对象上下文中使用该函数。