gpt4 book ai didi

c++ - 转换为具有相同数据成员布局但实现不同的类是否安全?

转载 作者:可可西里 更新时间:2023-11-01 16:44:36 25 4
gpt4 key购买 nike

第一个类将用于私有(private)继承,以确保完全相同的布局。这应该使类型转换安全。

#include <iostream>
#include <string>

struct data_base
{
data_base( int i, std::string&& s ) noexcept
: i_{ i }
, s_{ std::move( s ) }
{}

int i_;
std::string s_;
};

在这个简单的例子中,我打印了 int数据成员首先是 std::string data<true> 实例的数据成员.

template<bool = true>
struct data : private data_base // inherits
{
data( int i, std::string&& s ) noexcept
: data_base( i, std::move( s ) )
{}

void print()
{
std::cout << "data<true> - " << i_ << s_ << '\n';
}
};

然而,data<false>打印 std::string首先是数据成员,然后是 int数据成员。

template<>
struct data<false> : private data_base
{
void print()
{
std::cout << "data<false> - " << s_ << i_ << '\n';
}
};

例子:

int main()
{
data<true> d{ 5, "abc" };
d.print();
( ( data<false>& )d ).print();
}

演示:http://coliru.stacked-crooked.com/a/8b1262afe23dc0a2

如演示所示,即使使用 -fstrict-aliasing标记,没有警告。

现在,由于它们具有相同的布局,我想我可以在这两种类型之间进行转换以获得不同类型的静态多态性;没有虚函数调用的成本。

这种用法安全吗?还是我触发了未定义的行为?

最佳答案

这或多或少是描述的here ,即所谓的boost mutant idiom

据说(强调我的):

Boost mutant idiom makes use of reinterpret_cast and depends heavily on assumption that the memory layouts of two different structures with identical data members (types and order) are interchangeable. Although the C++ standard does not guarantee this property, virtually all the compilers satisfy it. Moreover, the mutant idiom is standard if only POD types are used.


注意:那个页面已经过时了,我不知道最近的修订是否改变了上面提到的保证

关于c++ - 转换为具有相同数据成员布局但实现不同的类是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39381726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com