c++ - &array[0]==(void*)&array 是否保证为真?
问题描述
指向任意数组的指针是否等于指向 void* 后数组第一个元素的指针,并且独立于编译器?
我需要一个模板函数,它接受一个指向数组的指针array[0]
并提供对数组的引用。下面的代码完成了这项工作(至少在 gcc 和 clang 中),我想知道这是否是合法的 C++ 代码。
我的怀疑是由于没有强制转换为 void* 使用模板的代码将无法编译(错误消息:``static_cast from 'int ' to 'int ( )[10]' is not allowed")。
提前致谢。这是代码:
template <std::size_t n, typename T>
inline T (& p2a( T * ptr))[n]
{
return *static_cast<T(*)[n]>( static_cast<void*>(ptr) );
}
解决方案
是的,数组的地址与数组的第一个元素的地址相同(即,数组的开头没有填充)并且强制转换void*
不会改变地址,所以你的代码做正确的事. 但是,更直接的写法如下:
template <std::size_t n, typename T>
inline auto p2a(T* ptr) {
return reinterpret_cast<T(&)[N]>(*ptr);
}
推荐阅读
- r - Powerpoint 操作 - 在索引处添加幻灯片或删除幻灯片
- bigtable - BigTable Scan withStopRow 包含问题
- corda - 如果 Corda OwnableState 由 AnonymousParty 拥有,谁来存储它?
- ios - iCloud 核心数据 2018
- c++ - boost::filesystem::path 中的“/”字符有什么用?
- php - 从部分英国邮政编码返回的结果不正确
- ios - 在搜索位置时,对 Google Map Swift 4 上的某些地址没有响应
- excel - 从两组单独的列创建新列表 - Excel
- javascript - 混合构造函数并在 Javascript 代理对象上应用陷阱
- python - 在系列上应用 Re 模块时遇到问题