相关疑难解决方法(0)

在 Type 和 Wrapper<Type> 之间 reinterpret_cast 是否安全?

假设我们有这样的类模板Wrapper

template <class T>
struct Wrapper { T wrapped; };
Run Code Online (Sandbox Code Playgroud)

什么类型的reinterpret_castaType和 a之间是安全的Wrapper<Type>?没有任何?标准布局?全部?

假设我们创建了这些 (TypeWrapper<Type>)之一的对象,并通过另一个读取和写入该对象。示例(在 Godbolt.org 上直播):

void F1() {
    std::stringstream ss;
    ss << "Hello";
    reinterpret_cast<Wrapper<std::stringstream>&>(ss).wrapped << " world";
}

void F2() {
    Wrapper<std::stringstream> ss;
    ss.wrapped << "Hello";
    reinterpret_cast<std::stringstream&>(ss) << " world";
}
Run Code Online (Sandbox Code Playgroud)

阅读这个答案的评论,这个领域在标准中似乎不是很明确。我认为所有编译器都会生成一个按预期工作的代码(即一种类型的值可以转换为另一种类型),但标准目前可能无法保证这一点。如果没有,问题就出现了:标准能否保证这些强制转换的定义明确的行为,或者在这种情况下保证任何事情是不可能/不切实际的?

因为我很确定,这些演员表实际上会起作用。

c++ strict-aliasing undefined-behavior language-lawyer reinterpret-cast

4
推荐指数
1
解决办法
153
查看次数

严格混叠规则对“包括上述类型之一的聚合或联合类型”的严格别名规则有什么影响?

以前,在basic.lval中有以下要点:

集合或联合类型,在其元素或非静态数据成员(递归包括子集合或包含的联合的元素或非静态数据成员)中包括上述类型之一,

在当前草案中,它已消失。

WG21的网站上有一些背景信息:http : //www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1359r0.html#2051

7.2.1 [basic.lval]第10段的别名规则是从C改编而成,并增加了C ++。但是,许多要点要么不适用,要么被其他要点包含。例如,在C中需要为集合和联合类型提供结构分配,这在C ++中是通过C ++中的构造函数和赋值运算符完成的,而不是通过访问完整对象来完成的。

谁能告诉我,这是什么意思?这个严格的别名规则与C中的结构分配有什么关系?

cppreference对此规则说:

这些项目符号描述了C ++中不会出现的情况

我不明白,为什么这是真的。例如,

struct Foo {
    float x;
};

float y;
float z = reinterpret_cast<Foo*>(&y)->x;
Run Code Online (Sandbox Code Playgroud)

最后一行似乎完成了项目要点描述的内容。它通过包含(成员)的集合访问y(a )。floatfloatx

谁能对此有所启发?

c++ struct strict-aliasing language-lawyer

3
推荐指数
1
解决办法
109
查看次数