Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么认为作为函数参数的const char*和const char[]是等效的?_C++ - Fatal编程技术网

C++ 为什么认为作为函数参数的const char*和const char[]是等效的?

C++ 为什么认为作为函数参数的const char*和const char[]是等效的?,c++,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(con

我知道:

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”)不一致的(不对称的)行为一开始就让我有点好奇。

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

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

template<size_t N>
void foo1(char (&a)[N]);
或者,如果您希望能够使用
std::array
或返回模板:

template<typename C>
void foo3(C a);
模板
3(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
chararr1[3]=“ab”;
foo1(arr1);//数组将*不*衰减为指针
数组arr2={{'a',b',0};
foo2(arr2);
向量vec1={a',b',0};
foo3(vec1);//可以通过std::vector
std::string str1=“ab”;
foo3(str1);//可以传递std::string
foo3(arr2);//可以传递std::数组

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

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

template<size_t N>
void foo1(char (&a)[N]);
或者,如果您希望能够使用
std::array
或返回模板:

template<typename C>
void foo3(C a);
模板
3(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
chararr1[3]=“ab”;
foo1(arr1);//数组将*不*衰减为指针
数组arr2={{'a',b',0};
foo2(arr2);
向量vec1={a',b',0};
foo3(vec1);//可以通过std::vector
std::string str1=“ab”;
foo3(str1);//可以传递std::string
foo3(arr2);//可以传递std::数组
在上我们可以找到

参数列表中每个功能参数的类型根据以下规则确定:

2) 如果类型为“T的数组”或“T的未知边界数组”,则替换为类型“指向T的指针”

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

关于

参数列表中每个功能参数的类型根据以下规则确定:

2) 如果类型为“T的数组”或“T的未知边界数组”,则替换为类型“指向T的指针”


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

这就是指定语言的方式,只要需要向后兼容C语言,它就会一直保持下去。向函数传递数组与向其第一个元素传递指针具有相同的效果。(除非数组是通过引用传递的)。在C++中,最好使用标准容器(例如,C++ > STD::String )作为函数参数,避免直接使用指针或原始数组。问题是C++曾经是向后兼容的,现在C++的新版本需要与C++的其他版本向后兼容。@ asCoPox-将数组转换为指针是继承C的一个特性,它是一种与C向后兼容的形式,不太可能很快消失。这就是语言的指定方式,只要需要与C向后兼容,它的特性就会一直存在。向函数传递数组与向其第一个元素传递指针具有相同的效果。(除非数组是通过引用传递的)。在C++中,最好使用标准容器(例如,C++ > STD::String )作为函数参数,避免直接使用指针或原始数组。问题是C++曾经是向后兼容的,现在C++的新版本需要与C++的其他版本向后兼容。@ ascGooper--数组转换为指针是继承自C的一个特性,它是一种与C的向后兼容性的形式,不太可能在任何时候消失。你是怎么在网上找到这个的?你读过每一页参考资料上的每一个字吗?答案令人信服。但我一直认为每个操作都应该是对称的。显然,这个答案不是。@Rick“因为语言是这样指定的”真的是一个可以接受的答案吗?这是一种类似于5只猴子和水的实验的情况。@VTT老实说,像“因为语言是这样规定的”这样的回答不能满足我的好奇心。我的意思是,它没有告诉我任何新的东西。所以我接受了这个。至少它提供了一些参考,并且很高兴知道“2)如果……”。我只想知道其他的长辈们是怎么考虑这个问题的,如果我学到一些新的东西我会很高兴。瑞克:为什么C和(C++)通过“值”传递函数参数,这意味着参数的值传递给堆栈上的函数。按值传递数组将意味着复制堆栈上的所有数组元素,由于许多原因(可能的堆栈溢出、未知数组维度等),这是不切实际的。因此,最初的语言设计人员随意地将参数转换为指针,指针可以像数组一样被取消引用。当你把所有的部分放在一起的时候,这是有道理的。该死,你怎么会在参考资料上找到这个?你读过每一页参考资料上的每一个字吗?答案令人信服。但我一直认为每个操作都应该是对称的。显然,这个答案不是。@Rick“因为语言是这样指定的”真的是一个可以接受的答案吗?这是