【发布时间】:2012-09-28 22:23:34
【问题描述】:
所以我目前正在编写一个接受用户文本输入的程序的一部分。我想忽略所有不是字母的输入字符,所以我认为 std::isalpha() 将是一个很好的方法。不幸的是,据我所知,有两个 std::isalpha() 函数,因此需要将通用函数与特定于语言环境的函数消除歧义:
(int(*)(int))std::isalpha()
如果我不消除歧义,std::isalpha 在读取大写字母时似乎返回 true,但在读取小写字母时返回 false(但是,如果我直接打印返回的值,它会为非 alpha 字符返回 0,对于大写字母返回 1字符,2 用于小写字符)。所以我需要这样做。
我之前在另一个程序中这样做过,但由于某种原因,在这个项目中,我有时会收到“ISO C++ forbids”错误。注意,只是有时。这是有问题的代码区域(它一起出现,中间没有任何东西):
std::cout << "Is alpha? " << (int(*)(int))std::isalpha((char)Event.text.unicode) << "\n";
if ( (int(*)(int))std::isalpha((char)Event.text.unicode) == true)
{
std::cout << "Is alpha!\n";
//...snip...
}
第一个实例,我将返回值发送到 std::cout,工作正常 - 我没有收到任何错误,我得到了预期值(0 表示非 alpha,1 表示 alpha),如果这是只有在我尝试消除歧义的地方,程序才能编译并运行良好。
然而,第二个实例抛出了这个:
error: ISO C++ forbids comparison between pointer and integer
并且只有在我删除 (int(*)(int)) sn-p 时才会编译,此时会出现不良行为。有人可以在这里启发我吗?
【问题讨论】:
-
为什么要进行比较
== true?不要那样做。从可读性的角度来看,它是多余的,并且在与表示“真实”的非零结果进行比较时会导致问题。 -
您能提供一个SSCCE 的问题吗?在将函数作为谓词传递给算法时,我只需要对
is*函数应用强制转换,以消除它们与区域感知对应物的歧义,而不是在您描述的用例中。 -
嗯,我想是坏习惯。我刚刚删除了它,现在它可以编译并且工作正常,所以谢谢!但我真的不明白为什么。即使返回类型是 int ,你也不能和 bool 进行比较,所有非零值都是 true 吗?