正在铸造 std::pair<T1, T2>常量&到 std::pair&l

Is casting std::pairlt;T1, T2gt; constamp; to std::pairlt;T1 const, T2gt; constamp; safe?(正在铸造 std::pairlt;T1, T2gt;常量amp;到 std::pairT1 const, T2常量amp;安全的?)
本文介绍了正在铸造 std::pair&lt;T1, T2&gt;常量&amp;到 std::pair<T1 const, T2>常量&amp;安全的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

reinterpret_cast std::pair 是否安全(理论上或实践中)?const & 转换为 std::pairconst &,假设程序员没有故意做一些奇怪的事情,比如专门化 std::pair?

Is it safe (in theory or in practice) to reinterpret_cast a std::pair<T1, T2> const & into a std::pair<T1 const, T2> const &, assuming that the programmer hasn't intentionally done something weird like specializing std::pair<T1 const, T2>?

推荐答案

这样做不可移植.

std::pair 要求在第 20.3 条中列出.第 17.5.2.3 条阐明

std::pair requirements are laid out in clause 20.3. Clause 17.5.2.3 clarifies that

第 18 条到第 30 条和附件 D 没有指定类的表示,并有意省略了类成员的说明.一个实现可以根据需要定义静态或非静态类成员,或两者都定义,以实现第 18 至 30 条和附件 D 中指定的成员函数的语义.

Clauses 18 through 30 and Annex D do not specify the representation of classes, and intentionally omit specification of class members. An implementation may define static or non-static class members, or both, as needed to implement the semantics of the member functions specified in Clauses 18 through 30 and Annex D.

这意味着实现包含部分特化是合法的(尽管不太可能),例如:

This implies that it's legal (although incredibly unlikely) for an implementation to include a partial specialization such as:

template<typename T1, typename T2>
struct pair<T1, T2>
{
    T1 first;
    T2 second;
};

template<typename T1, typename T2>
struct pair<const T1, T2>
{
    T2 second;
    const T1 first;
};

显然与布局不兼容.该规则还允许其他变体,包括可能在 first 和/或 second 之前包含额外的非静态数据成员.

which are clearly not layout-compatible. Other variations including inclusion of additional non-static data members possibly before first and/or second are also allowed under the rule.

现在,考虑布局已知的情况有点有趣.尽管 Potatoswatter 指出 DR1334 断言 Tconst T 不是 layout-compatible,标准提供了足够的保证,让我们无论如何都能获得大部分方式:

Now, it is somewhat interesting to consider the case where the layout is known. Although Potatoswatter pointed out DR1334 which asserts that T and const T are not layout-compatible, the Standard provides enough guarantees to allow us to get most of the way anyway:

template<typename T1, typename T2>
struct mypair<T1, T2>
{
    T1 first;
    T2 second;
};

mypair<int, double> pair1;
mypair<int, double>* p1 = &pair1;
int* p2 = reinterpret_cast<int*>(p1); // legal by 9.2p20
const int* p3 = p2;
mypair<const int, double>* p4 = reinterpret_cast<mypair<const int, double>*>(p3); // again 9.2p20

然而这不适用于 std::pair 因为我们不能在不知道 first 实际上是未指定的初始成员的情况下应用 9.2p20.

However this doesn't work on std::pair as we can't apply 9.2p20 without knowing that first is actually the initial member, which is not specified.

这篇关于正在铸造 std::pair&lt;T1, T2&gt;常量&amp;到 std::pair<T1 const, T2>常量&amp;安全的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

How do compilers treat variable length arrays(编译器如何处理变长数组)
Deduce template argument from std::function call signature(从 std::function 调用签名推导出模板参数)
check if member exists using enable_if(使用 enable_if 检查成员是否存在)
Standard Library Containers with additional optional template parameters?(具有附加可选模板参数的标准库容器?)
Uses of a C++ Arithmetic Promotion Header(C++ 算术提升标头的使用)
Parameter pack must be at the end of the parameter list... When and why?(参数包必须位于参数列表的末尾...何时以及为什么?)