为什么我不能将 lambda 赋值给函数参数作为默认值?
Why can't I assign lambdas to function parameters as a default value?
取下面的函数:
template<typename T>
decltype(auto) find_median(T begin,
T end,
bool sorted = false,
auto comparison = [](auto a, auto b){return a < b;}){
assert(begin != nullptr);
assert(end != nullptr);
return sorted ? find_median_sorted(begin, end) : find_median_unsorted(begin, end, comparison);
}
请注意,我将 comparison
参数设置为默认值 [](auto a, auto b){return a < b;}
。所以如果我像下面这样调用这个函数:find_median(std::addressof(arr), std::addressof(arr[9]))
其中 arr
是一个 std::array
,这应该可以工作。但它不起作用,有人能告诉我为什么吗?
您可以为已知类型提供默认值,但不能像这样为推导类型提供默认值。这不是语言支持的东西。
您必须为类型和提供默认值:
template<typename T, typename Cmp = std::less<>>
decltype(auto) find_median(T begin,
T end,
bool sorted = false,
Cmp comparison = {})
{
// ...
}
取下面的函数:
template<typename T>
decltype(auto) find_median(T begin,
T end,
bool sorted = false,
auto comparison = [](auto a, auto b){return a < b;}){
assert(begin != nullptr);
assert(end != nullptr);
return sorted ? find_median_sorted(begin, end) : find_median_unsorted(begin, end, comparison);
}
请注意,我将 comparison
参数设置为默认值 [](auto a, auto b){return a < b;}
。所以如果我像下面这样调用这个函数:find_median(std::addressof(arr), std::addressof(arr[9]))
其中 arr
是一个 std::array
,这应该可以工作。但它不起作用,有人能告诉我为什么吗?
您可以为已知类型提供默认值,但不能像这样为推导类型提供默认值。这不是语言支持的东西。
您必须为类型和提供默认值:
template<typename T, typename Cmp = std::less<>>
decltype(auto) find_median(T begin,
T end,
bool sorted = false,
Cmp comparison = {})
{
// ...
}