gpt4 book ai didi

c++ - 在 C++ 中,为什么 定义了 std::isspace 和::isspace?

转载 作者:搜寻专家 更新时间:2023-10-31 00:08:55 26 4
gpt4 key购买 nike

为什么大多数 C++ 编译器都能够推断出 ::isspace 的类型并将其隐式转换为 std::function,但它们却不能这样做对于 std::isspace?

请参阅the following不编译:

#include <cctype>
#include <functional>

template <typename Functish>
bool bar1(Functish f) { return f('a'); }

inline bool bar2(std::function<bool(char)> f) { return f('a'); }

#if 1
#define ff &std::isspace
#else
#define ff &::isspace
#endif

#if 0
bool foo()
{
return bar1(ff);
}
#else
bool foo()
{
return bar2(ff);
}
#endif

在 Compiler Explorer 支持的编译器中,ELLCC 似乎是唯一一个 std::isspace 具有我所期望的可推导性/可转换性的编译器。

最佳答案

std::isspace 有多个重载, 但只有一个 ::isspace .

header 声明了一个函数 int std::isspace(int) ,它也可能在全局命名空间中声明相同的函数(虽然它不必这样做)。

标题 定义了一个函数模板 template <class CharT> bool std::isspace(CharT, const std::locale&) .

头文件 声明了一个函数 int isspace(int) , 它也可以在命名空间 std 中声明相同的函数(虽然不必如此)。

似乎在 ELLCC 之外的编译器上, 包括 (或者两个 std::isspace 重载都在其他地方声明并包含在两个 header 中)。该标准仅指定标准标题必须声明的符号;它并不禁止他们声明不需要的其他符号。

std::isspace重载,你必须将它转换为 int(*)(int)以便编译器知道选择哪个重载。

关于c++ - 在 C++ 中,为什么 <cctype> 定义了 std::isspace 和::isspace?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46208733/

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