我知道:
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");
这样的限制。不一致的(不对称)行为使我在开始的第一刻就有点好奇。
答案 0 :(得分:1)
因为这就是指定语言的工作方式。
如果您明确希望将数组作为参数,则必须使用模板和引用:
template<size_t N>
void foo1(char (&a)[N]);
或者使用std::array
代替纯C样式的数组:
void foo2(std::array<char, 3> a);
或者,如果您希望能够使用std::array
或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
答案 1 :(得分:1)
在cppreference上我们可以找到
根据以下规则确定参数列表中每个功能参数的类型:
...
2)如果类型为“ T的数组”或“ T的未知范围的数组”,则将其替换为“ T的指针”类型
关于原因,我相信它像许多其他语言功能一样,是从C语言中简单地采用的。