在 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?
假设我有一些模板函数,它返回传递给它的一些可迭代对象的中值。
就像是:
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?我还在这里发现了这篇与可迭代元素相关的文章,但我不确定这如何适用于我的情况。
取以下函数:
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,这应该可以工作。但它不起作用,有人可以告诉我为什么吗?