【问题标题】:What does it mean in C++ when you have a parameter like ::lower? [duplicate]当你有一个像 ::lower 这样的参数时,它在 C++ 中意味着什么? [复制]
【发布时间】:2015-01-15 16:57:45
【问题描述】:

在 S.O. How to convert std::string to lower case? 之类的帖子,我看过 ::something 的语法,例如

std::transform(data.begin(), data.end(), data.begin(), ::tolower);

我想知道这意味着什么。我知道 std::transform 在命名空间std 中查找名为transform 的函数或变量。但是没有第一个参数的作用域运算符是什么意思呢?

【问题讨论】:

    标签: c++


    【解决方案1】:

    但是当范围运算符没有第一个时,它是什么意思 论据?

    它表示全局命名空间。

    考虑一个简单的例子。让我们假设您定义了函数swap。同时,您包含了标题<utility>,它还包含swap 的声明。并在使用命名空间std的指令之后;要区分它们,您需要使用限定名称。

    #include <iostream>
    #include <utility>
    
    using namespace std;
    
    
    void swap( int &x, int &y )
    {
        std::cout << "Inside ::swap" << std::endl;
        int tmp = x;
        x = y + 10;
        y = tmp + 10;
    }
    
    int main() 
    {
        int x = 1;
        int y = 2;
    
        std::swap( x, y );
    
        std::cout << "x = " << x << ", y = " << y << std::endl;
    
        x = 1;
        y = 2;
    
        ::swap( x, y );
    
        std::cout << "x = " << x << ", y = " << y << std::endl;
    
    
        return 0;
    }
    

    输出将是

    x = 2, y = 1
    Inside ::swap
    x = 12, y = 11
    

    在此示例中,::swap 指的是在全局命名空间中定义的函数交换,而std::swap 指的是在标题 &lt;utility&gt; 中的名称空间 std 中声明的标准函数 swap

    如果你会写不合格的名字

    swap( x, y );
    

    当编译器不知道调用哪个函数时:标准函数 std::swap 或您自己的函数 ::swap

    如果要排除指令

    using namepsace std;
    

    然后写

    swap( x, y );
    

    然后编译器会调用你自己的函数swap。

    现在我将解释为什么在您使用标准算法std::transform 的示例中使用::tolower。问题是在 C++ 中有两个函数名为 tolower。其中之一是在标头&lt;cctype&gt; 中声明的C 标准函数,另一个是在标头&lt;locale&gt; 中声明的C++ 函数。 C++ 标准允许将 C 标准函数放置在全局命名空间中。因此使用名称::tolower 允许编译器选择C 标准函数而不是C++ 函数。

    【讨论】:

      【解决方案2】:

      std::transform 函数遍历一个序列并对每个元素应用一个转换函数。

      最后一个参数是一个所谓的functor,它可以是一个函数指针或一个实现operator()的类的对象。 Functor 是一个在标准库的算法部分中应用非常广泛的概念。

      例如:非常有用函数将所有字符转换为给定字符:

      int testAnywhereInCppCode()
      {
          struct ToAnotherChar
          {   
              char _toChar;
              ToAnotherChar( char toChar):_toChar(toChar){}
              char operator()(char c){ return _toChar; }
          };
      
          ToAnotherChar toAnotherCharConverter('x');
      
          std::string data = "Hello World";
      
          std::transform(data.begin(), data.end(), data.begin(), toAnotherCharConverter);
          return 0;
      }
      
      static int testAnywhereInCppCodeCaller = testAnywhereInCppCode();
      

      :: 仅表示全局命名空间,其中实现了std::toLower

      但是 std::toLower 只是小写的标准方法。您可以实现自己的(例如,对于非常奇特的字符集)并将其与 std::transform 一起使用

      【讨论】:

        【解决方案3】:
        ::tolower
        

        表示将在全局命名空间中查找 tolower

        【讨论】:

        • 意味着它不在任何命名空间内?
        • @Failed 请参阅duplicatetolower 可能存在于全局命名空间中,std 或两者兼有。
        • @FailedSoftwareDeveloper 是
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-31
        • 1970-01-01
        • 1970-01-01
        • 2015-07-03
        • 2014-07-08
        • 1970-01-01
        • 2012-01-15
        相关资源
        最近更新 更多