c++ 为什么std::isupper不能直接应用于std::any_of,但isupper(来自C头)可以

mutmk8jj  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(157)

参见以下代码:

#include <algorithm>
#include <ctype.h>
#include <cctype>
#include <string>

int main() {
    std::string str = "a String";
    
    // compile fail: template deduction fail for _Pred
    // return std::any_of(str.begin(), str.end(), std::isupper);

    // OK:
    return std::any_of(str.begin(), str.end(), isupper); // or ::isupper
}

根据cppreference.comstd::isupperisupper具有相同的声明:
在标题中定义< cctype>
内部接口(内部通道);
在标题中定义<ctype.h>
内部接口(内部通道);
那么,为什么呢?

hc2pp10m

hc2pp10m1#

命名空间std中有多个isupper函数。一个是中定义的int std::isupper(int),另一个是中定义的template <typename charT> bool isupper( charT ch, const locale& loc )
似乎你的也包含了,使编译器无法推断出使用了哪个isupper。你可以尝试以下方法:

return std::any_of(str.begin(), str.end(), static_cast<int (*)(int)>(std::isupper));

但是,正如其他人提到的,最好使用lambda来 Package 对std::isupper的调用:

return std::any_of(str.begin(), str.end(), [](unsigned char c) { return std::isupper(c); });

相关问题