gpt4 book ai didi

c++ - 为什么 std::ranges::views::filter 不能将 std::isupper 作为参数?

转载 作者:行者123 更新时间:2023-12-03 06:52:08 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





std::transform() and toupper(), no matching function

(3 个回答)


去年关闭。




考虑以下代码:

#include <cctype>
#include <ranges>

constexpr inline auto filter_upper = std::views::filter(::isupper);
新系列适配器 filter_upper与全局旧 c 函数一起工作正常 ::isupper ,但如果我替换为 std::isupper ,我得到了这个编译器错误:
<source>:4:69: error: no match for call to '(const std::ranges::views::__adaptor::_RangeAdaptor<std::ranges::views::<lambda(_Range&&, _Pred&&)> >) (<unresolved overloaded function type>)'
4 | constexpr inline auto filter_upper = std::views::filter(std::isupper);
| ^
In file included from <source>:1:
/opt/compiler-explorer/gcc-10.2.0/include/c++/10.2.0/ranges:1102:4: note: candidate: 'constexpr auto std::ranges::views::__adaptor::_RangeAdaptor<_Callable>::operator()(_Args&& ...) const [with _Args = {}; _Callable = std::ranges::views::<lambda(_Range&&, _Pred&&)>]'
1102 | operator()(_Args&&... __args) const
| ^~~~~~~~
问题出在哪儿?

最佳答案

isupper 似乎有几个重载在 std命名空间,编译器不知道选择哪一个。如果您使用 static_cast<int (*)(int)>(std::isupper)它编译。
不管怎样,我相信你是不允许使用std的地址的。函数,所以最好使用 lambda:

constexpr inline auto filter_upper = std::views::filter([](unsigned char c) { return std::isupper(c); });

关于c++ - 为什么 std::ranges::views::filter 不能将 std::isupper 作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64350244/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com