代码之家  ›  专栏  ›  技术社区  ›  Rick Jim DeLaHunt

为什么作为函数参数的const char*和const char[]被认为是等价的?

c++
  •  0
  • Rick Jim DeLaHunt  · 技术社区  · 7 年前

    我知道:

    const char* foo = "ab"; // OK.There is a "array to pointer" decay
    const char a[3] = "ab"; // OK.
    const char a[2] = "ab"; // Error. "ab" is const char [3]
    

    那么为什么不在使用时也区分它呢 const char a[N] , const char * 作为函数参数?

    函数声明 void foo(const char *a) void foo(const char a[3]) 被认为是一样的。没有像这样的限制 const char a[2] = "ab"; 当我打电话 foo("abcdefg"); 不一致的( 不对称的 )行为让我在一开始就有点好奇。

    2 回复  |  直到 7 年前
        1
  •  1
  •   super    7 年前

    打开 cppreference 我们可以找到

    参数列表中每个函数参数的类型根据以下规则确定:
    ...
    2)如果类型是“T数组”或“T的未知界限数组”,则替换为“指向T的指针”类型

    至于原因,我相信它只是从C语言中采用的,就像许多其他语言特性一样。

        2
  •  1
  •   Some programmer dude    7 年前

    因为语言就是这样工作的。

    如果明确希望数组作为参数,则必须使用模板和引用:

    template<size_t N>
    void foo1(char (&a)[N]);
    

    或使用 std::array 而不是普通的C样式数组:

    void foo2(std::array<char, 3> a);
    

    或者如果你想 std::数组 std::vector 然后返回模板:

    template<typename C>
    void foo3(C a);
    

    最后一个可以 任何 具有相同接口的容器类型。


    使用上述功能的示例:

    char arr1[3] = "ab";
    foo1(arr1);  // Array will *not* decay to a pointer
    
    std::array<char, 3> arr2 = {{ 'a', 'b', 0 }};
    foo2(arr2);
    
    std::vector<char> vec1 = { 'a', 'b', 0 };
    foo3(vec1);  // Can pass std::vector
    
    std::string str1 = "ab";
    foo3(str1);  // Can pass std::string
    
    foo3(arr2);  // Can pass std::array