区分传递参考和传递价值

时间:2011-05-18 16:56:07

标签: c++ reference return-value ambiguity

传递引用函数通常如何区别于传值函数?例如:

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.

这两个功能含糊不清;其中一个必须重命名或完全删除。

如何避免这种情况?一种形式应该优先于另一种吗?或者是否有任何共同的命名准则来区分它们?

3 个答案:

答案 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)

FredOverflow击中了头部。但是,要回答您的问题“或者是否有任何共同的命名准则来区分它们?”只要确保你是一致的。例如,在您的示例中,第二个函数名称的SortCopy之类的东西。如果它是SortCopy,SortCpy,Sort_Copy并不重要..重要的是在整个代码中,你是一致的(例如 - 所有作用于副本的函数都有“复制”前缀 - 没有一个具有复制,下一个Cpy等...)。

答案 2 :(得分:0)

通常情况下,如果可能,最好不要传递非const引用,并使用第二种形式。这是因为首先,如果你想将返回值传递给另一个函数,第二个排序会更好,其次,因为编译器的优化器在大多数情况下会处理不必要的复制,第三个因为有一个引用可以防止任何类型的TMP检测到它实际上是一个返回值的事实,并阻止在任何类型的函数对象上下文中使用该函数。