相关疑难解决方法(0)

将指针强制转换为Array(int*to int [2])

如何将int*转换或转换为int [x]?

作为一个例子,我试图将指针int* c = new int[x]转换为数组int b[2]

int a    = 1;
int b[2] = { 2, 3 };
int* c   = new int[b[1]];

c[0] = b[0];
c[1] = b[1];
c[2] = a;
Run Code Online (Sandbox Code Playgroud)

首先,我知道我可以遍历指针和数组.因此,将指针转换为具有[]运算符的数组,以索引指针和数组,在迭代时将指针元素分配给数组元素(例如arr[i] = p[i]).我想知道在更少的代码行中是否可以实现相同的结果.

我试图自己搞清楚,所以我做了一个快速的程序,以确保我确切地知道我想要放置什么和在哪里.输出如下:

Address of {type: int} &a =             0031FEF4; a = 1
Address of {type: int[2]} &b =          0031FEE4; b = 0031FEE4
Address of {type: int[2]} &b[0] =       0031FEE4; b[0] = 2
Address of {type: int[2]} …
Run Code Online (Sandbox Code Playgroud)

c++ arrays pointers

22
推荐指数
1
解决办法
5万
查看次数

放置new的返回值与其操作数的转换值之间是否存在(语义)差异?

放置new的返回值与其操作数的转换值之间是否存在(语义)差异?

struct Foo { ... };
char buffer[...];

Foo *a = new(buffer) Foo;
Foo *b = reinterpret_cast<Foo *>(buffer);
Run Code Online (Sandbox Code Playgroud)

是否ab以某种方式有什么不同?


编辑:根据DaBler的评论,这个问题告诉我,如果使用const/reference成员则存在差异:使用const成员放置新类和赋值

所以,我的小位的更新问题:是否ab以任何方式不同,如果Foo没有const或引用成员?

c++ strict-aliasing placement-new language-lawyer reinterpret-cast

13
推荐指数
2
解决办法
488
查看次数

可以使用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
查看次数

static_cast'd指针值

在当前的标准草案(和C++ 17)中,是关于static_casting的void *:

类型"指针的prvalue CV1空隙"可以被转换成类型的prvalue"指针CV2 T",其中T是一个对象类型和CV2是相同的CV-资格,或更大的CV-资格比,CV1.如果原始指针值表示存储器中字节的地址A而A不满足T的对齐要求,则未指定结果指针值.否则,如果原始指针值指向对象a,并且存在类型为T(忽略cv-qualification)的对象b,该对象b是指针可互换,则结果是指向b的指针.否则,转换指针值不变.

我想知道,转换是指针可互换的有什么区别?有没有一种情况,当一个void *东西指向一个指针 - 可互换实际上改变指针值?这种区别的意图是什么?

对于完整性指针可互换:

如果出现以下情况,则两个对象a和b是指针可互换的:

  • (4.1)它们是同一个对象,或者
  • (4.2)一个是union对象,另一个是该对象的非静态数据成员([class.union]),或者
  • (4.3)一个是标准布局类对象,另一个是该对象的第一个非静态数据成员,或者,如果该对象没有非静态数据成员,则该对象的任何基类子对象([class. mem]),或
  • (4.4)存在对象c,使得a和c是指针可互换的,并且c和b是指针可互换的.

如果两个对象是指针可互换的,则它们具有相同的地址,并且可以通过reinterpret_cast从指向另一个的指针获得指向一个对象的指针.

c++ void-pointers static-cast language-lawyer c++17

9
推荐指数
1
解决办法
456
查看次数