C++ 错误C2234:引用数组非法
我编写的代码如下:C++ 错误C2234:引用数组非法,c++,C++,我编写的代码如下: void Print(const int & dataArray[], const int & arraySize) { // problem for(int i = 0; i<arraySize; i++) { cout << dataArray[i] << " "; } cout << endl; } 编译器说引用数组是非法的,为什么它是非法的?? 我看到了,
void Print(const int & dataArray[], const int & arraySize) { // problem
for(int i = 0; i<arraySize; i++) {
cout << dataArray[i] << " ";
}
cout << endl;
}
编译器说引用数组是非法的,为什么它是非法的??
我看到了,它说建议我们使用const和reference,我只是尝试实现它(我是初学者),我还想知道在
void打印中(const int dataArray[],const int&arraySize)
参数我使用const,来限定arraySize,对吗?(还是比int arraySize或const int arraySize好得多?),我还想使用const和to dataArray[],但我失败了 数组要求其元素是默认可构造的,而引用不是,因此引用数组是非法的。这:
const int & dataArray[]
是一个引用数组。如果希望引用数组,则需要:
const int (&dataArray)[]
数组要求其元素是默认可构造的,而引用不是,因此引用数组是非法的。这:
const int & dataArray[]
是一个引用数组。如果希望引用数组,则需要:
const int (&dataArray)[]
迂腐地说,引用数组非法的原因是因为标准明确禁止它们 C++03:8.3.2/4 不得引用参考文献,不得引用参考文献数组, 而且没有指向引用的指针 我的 标准明确禁止引用数组(可能还有更多)的一个原因是数组的索引方式。假设你这样做:
Gizmo& gizmos[] = {...};
Gizmo&* g3 = &gizmos[2];
这里有几件事不对。首先,您有一个指向引用的指针,这是非法的。其次,为了计算gizmo[2],编译器必须对指针进行隐式转换,然后在此基础上进行指针算术。小发明有多大&
根据该标准,sizeof
a reference本身未指定。但是,当sizeof
应用于引用时,结果是引用类型的大小
C++03:5.3.3/2 Sizeof
应用于引用或引用类型时,结果为
引用类型的大小
尝试运行此代码,看看会发生什么:
#include <iostream>
#include <iomanip>
using namespace std;
struct Gizmo { int n_[100]; };
int main()
{
typedef Gizmo& GR;
size_t n = sizeof(GR);
cout << n << endl;
}
#包括
#包括
使用名称空间std;
结构Gizmo{int n_uU100];};
int main()
{
typedef Gizmo&GR;
尺寸n=尺寸f(GR);
从学术角度讲,引用数组非法的原因是因为标准明确禁止它们
C++03:8.3.2/4
不得引用参考文献,不得引用参考文献数组,
而且没有指向引用的指针
我的
标准明确禁止引用数组的一个原因(可能还有更多)是因为数组的索引方式。假设您这样做:
Gizmo& gizmos[] = {...};
Gizmo&* g3 = &gizmos[2];
这里有几点错误。首先,您有一个指向引用的指针,这是非法的。其次,为了计算小控件[2]
,编译器必须对指针进行隐式转换,然后在此基础上进行指针算术。小控件有多大&
根据该标准,引用的sizeof
本身是未指定的。但是当sizeof
应用于引用时,结果是引用类型的大小
C++03:5.3.3/2 Sizeof
应用于引用或引用类型时,结果为
引用类型的大小
尝试运行此代码,看看会发生什么:
#include <iostream>
#include <iomanip>
using namespace std;
struct Gizmo { int n_[100]; };
int main()
{
typedef Gizmo& GR;
size_t n = sizeof(GR);
cout << n << endl;
}
#包括
#包括
使用名称空间std;
结构Gizmo{int n_uU100];};
int main()
{
typedef Gizmo&GR;
尺寸n=尺寸f(GR);
无法创建引用数组?按值获取int
的常量引用可能比按值获取int
的效率低。如何创建引用数组?按值获取int
的常量引用可能比按值获取int
的效率低。数组实际上不会y要求它的元素是默认可构造的。在8.3.4/1中对引用数组有一个明确的禁止。数组实际上并不要求它的元素是默认可构造的。在8.3.4/1中对引用数组有一个明确的禁止。哇,实际上有人试图合理化标准所说的,而不是han只是说“看:这是禁止的”。;-)+1在我看来,数组/引用容器的概念的问题最清楚的表述是:如果没有明确说明,那么答案中就隐含了这样一种说法:我们如何消除元素地址与引用本身之间的歧义?如果不完全打破数组语义,我们就无法做到这一点(索引、算术)并且添加无意义的语法来消除歧义。当简单地将引用包装在结构中时,我们保留了两个选项:引用的地址或其父对象的地址……我的意思是“引用的目标地址或其父对象的地址struct
”。无论如何,我在这里漫谈了所有这些内容——如果可能的话,最终可能会将其作为答案发布让它变成一个有用的长格式,而不要陷入咆哮,呵呵。哇,实际上有人试图使标准所说的合理化,而不仅仅是说‘看,这是禁止的’;-)+1在我看来,关于引用数组/容器这个概念的问题,最清楚的表述是:如果没有明确说明,那么答案中可能隐含着这样一种说法:我们如何消除元素地址与引用本身之间的歧义?如果不完全打破数组语义(索引、算术),我们就无法做到这一点并且添加无意义的语法来消除歧义。当简单地将引用包装在结构中时,我们保留了两个选项:引用的地址或其父对象的地址……我的意思是“引用的目标地址或其父对象的地址struct
”。无论如何,我在这里漫谈了所有这些内容——如果可能的话,最终可能会将其作为答案发布把它变成一个有用的长形,而不要陷入咆哮,呵呵。