为什么将const char *和const char []作为函数参数视为等效?

时间:2018-07-29 11:49:37

标签: c++

我知道:

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 个答案:

答案 0 :(得分:1)

因为这就是指定语言的工作方式。

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

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

或者使用std::array代替纯C样式的数组:

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

或者,如果您希望能够使用std::arraystd::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

答案 1 :(得分:1)

cppreference上我们可以找到

  

根据以下规则确定参数列表中每个功能参数的类型:
  ...
  2)如果类型为“ T的数组”或“ T的未知范围的数组”,则将其替换为“ T的指针”类型

关于原因,我相信它像许多其他语言功能一样,是从C语言中简单地采用的。