首页 > 解决方案 > 对未知边界数组的引用 (C++)

问题描述

我有一个模板类,用于对对象的视图进行建模,例如std::shared_ptrstd::weak_ptr没有任何拥有的语义。该类内部包含一个指向查看对象的指针和一个在类销毁时调用的函子(这对于对查看的对象进行引用计数,或对查看的资源的线程安全锁定和释放很有用)。

与标准库对应物一样,我希望我的类在拥有的对象是数组 ( T[]) 时按预期运行。我面临的问题来自一个事实,即指向未知边界数组的指针,据我所知,是非法的 C++。更具体地说,假设类的模板参数T是,比如说,int[]当我在我的课堂上写:

T& operator*() {
    return *internal_pointer;
}

我实际上是在调用未定义的行为。(或者,可能是一些非标准的编译器扩展?)

我知道,为了避免这些情况,需要一个类模板特化——一个指向元素类型的指针int可以被保留,并被类视为指向数组的指针。但是,我的问题是:为什么对未知边界数组的指针和引用是非法的?

在我看来,使用它们是最合乎逻辑的事情,因为您正在查看的是一个您可能不一定知道长度的数组:这保留了查看对象的类型,而指向元素类型的常规指针似乎对我来说只不过是一个黑客。

是否有任何技术原因不允许引用未知边界的数组?

标签: c++arraystemplates

解决方案


我面临的问题来自一个事实,即指向未知边界数组的指针,据我所知,是非法的 C++。

你错了。指向未知边界数组的指针在 C++ 中不是非法的。

我实际上是在调用未定义的行为。(或者,可能是一些非标准的编译器扩展?)

两者都不是(只要指针有效)。显示的函数符合标准,即使T是未知边界的数组。

为什么指向未知边界数组的指针和引用是非法的?

它们并不违法。


曾经有一种特殊情况,指向未知边界数组的指针和引用作为函数参数是非法的。这在 2014 年的缺陷解决方案中合法化


推荐阅读