相关疑难解决方法(0)

可以使用std :: launder将对象指针转换为其封闭的数组指针吗?

目前的标准草案(可能是C++ 17)在[basic.compound/4]中说:

[注意:数组对象及其第一个元素不是指针可互换的,即使它们具有相同的地址. - 结束说明]

因此,指向对象的指针不能reinterpret_cast获得其封闭的数组指针.

现在,有std::launder,[ptr.launder/1]:

template<class T> [[nodiscard]] constexpr T* launder(T* p) noexcept;

要求:p表示内存中字节的地址A. 在其生命周期内且其类型类似于T的对象X位于地址A处.可通过结果到达的所有存储字节都可通过p(见下文)到达.

和的definion 可达是在[ptr.launder/3] :

备注:只要可以在核心常量表达式中使用其参数的值,就可以在核心常量表达式中使用此函数的调用.如果对象Y位于Y所占用的存储区内,则指向存储的字节可以到达,如果Y是指针可互换的对象,则指向对象Y,或者如果Y是数组元素,则指向立即封闭的数组对象.如果T是函数类型或cv void,则程序格式错误.

现在,乍一看,似乎std::launder可以用来做上述转换,因为我强调的部分.

但.如果p指向数组的对象,则根据此定义可以访问数组的字节(即使p不是指针可互换为数组指针),就像清洗的结果一样.因此,该定义似乎没有说明这个问题.

那么,可以std::launder用来将对象指针转换为其封闭的数组指针吗?

c++ language-lawyer c++17

12
推荐指数
1
解决办法
576
查看次数

基于范围的堆分配数组的循环

考虑下面的代码,该代码将success准确显示三遍:

int arr [3];

for(int& value : arr )
    std::cout << "success" << std::endl;
Run Code Online (Sandbox Code Playgroud)

如果我尝试在堆上分配数组,则会出现问题。该代码无法编译:

int* ptr = new int[3];

for(int& value : *ptr )
    std::cout << "success" << std::endl;
Run Code Online (Sandbox Code Playgroud)

由于指针已取消引用,因此类型应相同。所以我有一些问题:

  • 当我从两个表达式中的硬件询问时,两者之间的根本区别是什么。我想了解为什么后者没有意义。
  • 我可以做一点零钱吗?

c++ pointers c++11

5
推荐指数
2
解决办法
244
查看次数

标签 统计

c++ ×2

c++11 ×1

c++17 ×1

language-lawyer ×1

pointers ×1