考虑以下职能:
void func1(int unsized_array[]){}
void func2(int sized_array[10]){}
void func3(int *pointer){}
根据下列结果:
std::cout << std::is_same<decltype(func1), decltype(func2)>::value << std::endl;
std::cout << std::is_same<decltype(func2), decltype(func3)>::value << std::endl;
std::cout << std::is_same<decltype(func3), decltype(func1)>::value << std::endl;
这三个函数的类型是相同的。在函数func2
中,sizeof
运算符也不提供数组元素的大小。
那么,大小数组作为函数参数的目的是什么(比如func2
)?
发布于 2021-04-12 11:54:28
3*4;
)、没有副作用的逗号表达式的左操作数、空体的函数或循环等等。需要做大量工作才能将没有影响的东西排除在语言之外。)。
参数中的
static
关键字出现时确实会改变含义;void func2(int asd[static 10])
声明一个函数,该函数必须传递一个指向至少十个元素中的第一个元素的指针,这与其他声明的含义不同。(这将使从数组参数声明的语法中排除大小表达式的问题更加复杂,因为有必要禁止裸大小,但不禁止使用static
.)。
对于函数实现者和函数用户来说,数组大小可能是有用的文档。
void func2(int asd[printf("Hello")]) {}
,则在调用函数时将打印“Hello”。(有些编译器可能不会这样做;C标准对此并不清楚。)。
static
。)。
发布于 2021-04-12 11:57:40
没有目的,因为他们都腐烂到相同的类型,正如你正确地识别。对于C++,此行为是从C继承的。
就像将const
添加到非引用参数和其他关键字不会将任何内容更改到外部一样,它们都会导致void(int)
签名。
void foo1(int a) {}
void foo2(const int a) {}
void foo3(volatile int a) {}
但是,与int[10]
不同,您可以使用一些实际工作的东西:
void func2(int(&asd)[10]) {}
这将只接受大小为10的int
数组。您现在还可以使用sizeof
在编译时获得数组大小,显然int[10]
不可能这样做。
https://stackoverflow.com/questions/67057724
复制相似问题