常量数组的类型

6

在标准中是否明确规定const数组元素的类型与非const数组元素的类型不同?以下是我的代码以及VC2010和GCC4.8.0的输出。

谢谢。

#include <iostream>
#include <typeinfo>
#include <ios>
int main(){
    int arr_a[] = {1, 2};
    int const arr_b[] = {3, 4}; // or const int arr_b[] = {3, 4};
    std::cout << typeid(arr_a).name() << "\n";
    std::cout << typeid(arr_b).name() << "\n";
    std::cout << "Same type: " << std::boolalpha << (typeid(arr_a) == typeid(arr_b)) << ".\n";
}

int [2]
int const [2]
Same type: false.

A2_i
A2_i
Same type: true.

GCC的typeid似乎忽略了顶层的const,但不要轻信它。 - gx_
@gx_ 相信它!5.2.8/5忽略了顶层const。问题是,如果const int a[2]有一个**顶层const**。 - MWid
1
是的,const int a[2] 是一个_cv-qualified_类型(参见8.3.4和3.9.3)。因此,gcc的输出是正确的。但是 arr_aarr_b 的类型是不同的。如果您想根据cv限定符区分类型,则不能使用 typeid - MWid
对于数组,cv修饰符适用于子对象,而不是顶层。 - billz
@MWid 我的意思是,不要相信 typeid 知道两种类型是否相同,特别是涉及到 const 的时候(感谢您提供了有关标准的参考)。 - gx_
@billz 注意,cv-qualifier 的含义与是否为顶层无关。因此,const int a[2] 的类型是 _array of 2 const int_,但 a 的类型是_cv-qualified_。忽略这个顶层的 const 意味着将 a 的类型替换为 _array of 2 int_。 - MWid
2个回答

2

C++11标准实际上是这样说的(3.9.3/1) (我强调):

[...] 类型的cv限定或无cv限定版本是不同的类型; 然而,它们应具有相同的表示和对齐要求

具体来说:

相同的表示和对齐要求意味着它们可以互换作为函数参数、函数返回值以及联合体的非静态数据成员


0
如上所述,typeid().name() 不是一个很好的选择,因为结果是实现定义的。请尝试这个:
#include <iostream>
using namespace std;

void array_function(const int a[]) {
   cout << "const int a[]" << endl;
}

void array_function(int a[]) {
   cout << "int a[]" << endl;
}


int main()
{
    const int carray[] = { 1, 2, 3};
    int array[] = { 1, 2, 3};
    array_function(carray);
    array_function(array);
}

这将向您展示编译器可以区分它们。(类型是不同的。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接