"::"在":: tolower"中的含义是什么?

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.输入为 ::tolowerint,并且必须在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,这是一种多字节编码,并不适用于任何可用的可能性.)


Ebo*_*ike 9

意味着它明确地使用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)