【问题标题】:Pointer and References to Array with Consts in C++C++ 中带常量的数组的指针和引用
【发布时间】:2015-09-07 16:33:50
【问题描述】:

我很清楚const pointer to pointer problem,我以为我知道发生了什么,但我错了。我想实现这个:

int* var[4];
const int* const (&refArray)[4] = var;      //compile error

是的,我想保留数组而不是转换为指针,是的,我实际上在我的代码中遇到了这个问题。所以我继续调查我能做什么和不能做什么,不久我意识到我不知道发生了什么:

int* var[4];

const int* const * ptr = var;                     //allowed
const int* const * (&refPtr_indirect) = ptr;      //allowed

const int* const * (&refPtr) = var;               //error

const int* const * const (&constRefPtr) = var;    //allowed

int* const (&refArray)[4] = var;                  //allowed

const int* const (&refArray)[4] = var;            //error

我可以理解前四个,但后两个对我来说完全没有意义。我确实看到第三个版本可能会起作用并且我可以删除reference,但我真的希望保留数组类型。

感谢您提供任何帮助,但希望它可以包括为什么规则是这样的原因。

【问题讨论】:

  • 有什么理由不只使用std::arrayboost::array
  • 在任何情况下,您都应该从指向数组的指针&var 进行初始化。这也行不通,但可能更容易找出原因。

标签: c++ arrays pointers reference constants


【解决方案1】:

您有一个由四个指向(非常量)int 的指针组成的数组。要将其视为指向const int 的四个指针的数组,您需要使用类型双关语。 int [4]const int [4] 类型不同,一个引用不能引用另一个。

您能做的最好的事情就是对整个数组进行持续引用。在这种复杂的情况下,最好使用一些类型名称来便于管理:

typedef int* TheArray[4];
TheArray var;
const TheArray &ref = var;

这给了你这个:

ref[0];  // OK
ref[0] = nullptr;  // error
*ref[0];  // OK
*ref[0] = 42;  // OK

你的第五个版本是一样的,只是没有类型名称

int * const (&refArray) [4] = var;

对一个由四个指向int 的指针组成的常量数组的引用。 (常量数组和常量元素数组一样)。

第六个版本不可能工作,正如我在顶部所说的那样——数组元素的类型不同,所以没有引用可以同时引用它们。

【讨论】:

  • 谢谢,这确实有很大帮助。然而,这带来了一个问题,是否有可能让一切都成为const
  • @PasserBy 不是没有类型双关语(这通常是未定义的行为)。这就是为什么我说“你能做到的最好的......”
【解决方案2】:

Angew 得到了一些分数,但我认为问题在于:

您无法将int*[n] 转换为const int*[n]

所以这是允许的:

int a[4];
const int (&b)[4] = a;

但以下不是:

int *c[4];
const int *(&d)[4] = c;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    相关资源
    最近更新 更多