2013-07-02 147 views
6

是否在标准中指定常量元素数组的类型与非常量元素数组的类型不同?这里是我的代码和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. 
+0

GCC的'typeid'好像忽略了顶级的'const',但不信任它。 –

+0

@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_a'和'arr_b'的类型是不同的。如果您想区分与cv-qualifiers相关的类型,则不能使用'typeid'。 – MWid

回答

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); 
} 

它会告诉你编译器可以区分不同。 (类型不同。)