zjy*_*qs 7 c++ argument-dependent-lookup c++20 std-ranges
否则,如果 Ranges::disable_sized_range<std::remove_cv_t<T>> 为 false,则 size(t) 转换为其衰减类型,并且转换后的表达式有效且具有类似整数的类型,其中重载解析通过以下命令执行以下候选人:
void size(auto&) = delete;void size(const auto&) = delete;1
class Test {
friend size_t size(/*const*/ Test&) {
return 0;
}
};
int main() {
std::ranges::size(Test{});
// no matching function error when adding the `const` qualifier
}
Run Code Online (Sandbox Code Playgroud)
https://godbolt.org/z/79e5vrKrT
一般来说,方法size不需要像std::size.
为什么会有这样的限制呢std::ranges::size?(好像只有非会员版才能执行。)
为什么会有这样的限制呢
std::ranges::size?(好像只有非会员版才能执行。)
尽管该size方法不修改范围,但某些范围没有const- 限定成员begin(),这仅允许非const- 限定对象对 a 进行建模range。
这也使得一些范围适配器在标准中可能只有一个const不合格size。
对于您的示例,考虑到Test只有非const begin/end或 size,那么friend size_t size(Test&)实际上只能是选项。