小编bee*_*oop的帖子

在 C++ 中限制“auto”是否违背了它的目的?

在 C++20 中,我们现在能够将auto关键字限制为仅属于特定类型。因此,如果我有一些如下所示的代码,没有任何限制:

auto something(){
  return 1;
}

int main(){
  const auto x = something();
  return x;
}
Run Code Online (Sandbox Code Playgroud)

这里的变量x被推导为一个int。然而,随着 C++20 的引入,我们现在可以将 约束auto为某种类型,如下所示:

std::integral auto something(){
  return 0;
}

int main(){
  const auto x = something();
  return x;
}
Run Code Online (Sandbox Code Playgroud)

这不是违背了来这里的目的吗auto?如果我真的需要一个std::integral数据类型,我不能完全省略吗auto?我是否完全误解了使用auto

c++ auto c++-concepts c++20

72
推荐指数
3
解决办法
7730
查看次数

如何使用概念将模板限制为可迭代范围?

假设我有一些模板函数,它返回传递给它的一些可迭代对象的中值。

就像是:

template<typename T>
decltype(auto) find_median_sorted(T begin)
{
  // some code here
}
Run Code Online (Sandbox Code Playgroud)

现在我想确保我T始终是可迭代的。我正在尝试学习如何concepts在 C++ 中使用,那么我可以concept在这里使用某种方法来确保T它是可迭代的吗?

我确信还有其他方法来检查它是否可迭代,但这是否是一个错误的用例concepts我还在这里发现了这篇与可迭代元素相关的文章,但我不确定这如何适用于我的情况。

c++ templates function-templates c++-concepts c++20

6
推荐指数
1
解决办法
945
查看次数

为什么我不能将 lambda 表达式指定为函数参数作为默认值?

取以下函数:

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);
}
Run Code Online (Sandbox Code Playgroud)

请注意,我将comparison参数设置为默认值[](auto a, auto b){return a < b;}。因此,如果我像下面这样调用这个函数:find_median(std::addressof(arr), std::addressof(arr[9]))where arris an std::array,这应该可以工作。但它不起作用,有人可以告诉我为什么吗?

c++ lambda templates c++20

1
推荐指数
1
解决办法
67
查看次数

标签 统计

c++ ×3

c++20 ×3

c++-concepts ×2

templates ×2

auto ×1

function-templates ×1

lambda ×1