【发布时间】:2015-02-26 10:30:01
【问题描述】:
我们有以下从地图中获取值的便利函数 如果未找到键,则返回后备默认值。
template <class Collection> const typename Collection::value_type::second_type&
FindWithDefault(const Collection& collection,
const typename Collection::value_type::first_type& key,
const typename Collection::value_type::second_type& value) {
typename Collection::const_iterator it = collection.find(key);
if (it == collection.end()) {
return value;
}
return it->second;
}
这个函数的问题是它允许传递一个临时对象作为第三个参数,这将是一个错误。例如:
const string& foo = FindWithDefault(my_map, "");
是否可以通过使用以某种方式禁止将右值引用传递给第三个参数 std::is_rvalue_reference 和静态断言?
【问题讨论】:
-
在那里传递
""感觉非常直观。最好找到一种方法来防止FindWithDefault被绑定到引用,除非我认为没有。无论如何,在本例中,最好简单地将foo设为一个值。 -
这个问题的另一个问题是你已经跳到你认为的解决方案,而不是陈述问题。这样做时,您专注于右值引用,但这不是唯一的问题;对-
const-temporary 的左值引用会同样难受。也许按值取默认的value。 -
您可以按值返回,而不是按引用返回。对于默认查找而言,这似乎很自然。
-
如果您不允许传递右值,用户将创建一个变量并传递它。他不会被警告返回值是对其变量的引用。这看起来很危险且有缺陷,除非你在课程文档中写了一个大的红色警告