Vex*_*toR 12 c++ string stl std scope-resolution
我见过这样的代码:
std::string str = "wHatEver";
std::transform(str.begin(), str.end(), str.begin(), ::tolower);
Run Code Online (Sandbox Code Playgroud)
我有一个问题:::
在tolower之前意味着什么?
并std::tolower
没有用,但::tolower
工作正常
Jam*_*nze 10
至于为什么::
是必要的:该标准定义了两个tolower
的,在一个函数模板std::
,并在这两个简单的功能::
和
std::
.根据已包含的标头(包括您可能不知道的其他标头间接包含的标头),可以看到其中一个,另一个或两者.使用::
确保使用C标准中较旧的标准.(如果std::
考虑中的那个,则调用将是不明确的,因为transform本身就是模板,并且编译器将无法推导出模板参数.)
虽然我对它,我可能会提到使用::tolower
这样的是未定义的行为,至少如果签署了普通的char.输入为
::tolower
int,并且必须在0
... UCHAR_MAX
,或范围内EOF
.如果签署了普通字符,则某些字符可能具有否定编码,这会导致未定义的行为.实际上,大多数实现都使这项工作成功.对于除0xFF
(拉丁语1中的ÿ)之外的所有字符.如果你不关心可移植性,一些编译器有一个开关来使char无符号---使用它.否则,编写一个小函数对象来正确处理它,或者:
struct ToLower
{
char operator()( char ch ) const
{
return ::tolower( static_cast<unsigned char>(ch) );
}
};
Run Code Online (Sandbox Code Playgroud)
或者(更好,但显着更多的工作 - 只有你很多地使用它才值得),一个功能对象,其构造函数采用一个语言环境(默认为全局语言环境)并包含std::ctype
对它的引用,它用于tolower
函数.(当然,如果你真的国际化,tolower
可能没有任何意义.你将使用UTF-8,这是一种多字节编码,并不适用于任何可用的可能性.)
意味着它明确地使用tolower
全局命名空间(可能是stdc lib).
例:
void foo() {
// This is your global foo
}
namespace bar {
void foo() {
// This is bar's foo
}
}
using namespace bar;
void test() {
foo(); // Ambiguous - which one is it?
::foo(); // This is the global foo()
}
Run Code Online (Sandbox Code Playgroud)