c++ - 对未知边界数组的引用 (C++)
问题描述
我有一个模板类,用于对对象的视图进行建模,例如std::shared_ptr
但std::weak_ptr
没有任何拥有的语义。该类内部包含一个指向查看对象的指针和一个在类销毁时调用的函子(这对于对查看的对象进行引用计数,或对查看的资源的线程安全锁定和释放很有用)。
与标准库对应物一样,我希望我的类在拥有的对象是数组 ( T[]
) 时按预期运行。我面临的问题来自一个事实,即指向未知边界数组的指针,据我所知,是非法的 C++。更具体地说,假设类的模板参数T
是,比如说,int[]
当我在我的课堂上写:
T& operator*() {
return *internal_pointer;
}
我实际上是在调用未定义的行为。(或者,可能是一些非标准的编译器扩展?)
我知道,为了避免这些情况,需要一个类模板特化——一个指向元素类型的指针int
可以被保留,并被类视为指向数组的指针。但是,我的问题是:为什么对未知边界数组的指针和引用是非法的?
在我看来,使用它们是最合乎逻辑的事情,因为您正在查看的是一个您可能不一定知道长度的数组:这保留了查看对象的类型,而指向元素类型的常规指针似乎对我来说只不过是一个黑客。
是否有任何技术原因不允许引用未知边界的数组?
解决方案
我面临的问题来自一个事实,即指向未知边界数组的指针,据我所知,是非法的 C++。
你错了。指向未知边界数组的指针在 C++ 中不是非法的。
我实际上是在调用未定义的行为。(或者,可能是一些非标准的编译器扩展?)
两者都不是(只要指针有效)。显示的函数符合标准,即使T
是未知边界的数组。
为什么指向未知边界数组的指针和引用是非法的?
它们并不违法。
曾经有一种特殊情况,指向未知边界数组的指针和引用作为函数参数是非法的。这在 2014 年的缺陷解决方案中合法化
推荐阅读
- jquery - 在 Jquery / Ajax 中使用 for 循环动态创建行
- python - 通过 Python win32com 从 Outlook 中读取联系人详细信息
- node.js - 如何以编程方式使用节点 js 使用 gnupg 创建密钥对?
- javascript - 电子安装中止 - ECONNRESET
- ibm-cloud - 如何通过 REST API 检索资源组?
- java - 线程如何在 try-catch 块中被杀死?
- asp.net - 如何在 OnInit 函数中插入回调函数?
- angular5 - Angular 6-摆脱输入装饰器限制
- java - 将字符串二进制转换为int十进制
- python - 如何单独设置 TimeField 00:00:00:在 django 中