2

引用传递函数通常如何与值传递函数区分开来?例如:

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.

这两个功能是模棱两可的;其中之一必须重命名或完全删除。

如何避免这种情况?一种形式是否应该优于另一种形式?还是有任何通用的命名准则来区分它们?

4

3 回答 3

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;
}
于 2011-05-18T17:01:58.890 回答
2

FredOverflow 一针见血。但是,要回答您的问题“或者是否有任何通用的命名准则来区分它们?” 只要确保你是一致的。例如,您的示例中的第二个函数名称类似于 SortCopy。是 SortCopy、SortCpy、Sort_Copy 都没有关系。重要的是,在整个代码中,您是一致的(例如,作用于副本的所有函数都具有“Copy”前缀 - 没有一个具有 Copy,下一个 Cpy 等...)。

于 2011-05-18T17:10:35.270 回答
0

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

于 2011-05-18T17:05:57.793 回答