gpt4 book ai didi

重新解释模板参数常量的 C++ 编译器行为

转载 作者:行者123 更新时间:2023-11-30 03:36:46 24 4
gpt4 key购买 nike

在处理 RAII 风格的守卫对象时,我最终在模板参数中编码了一些守卫状态。这似乎是合理的,例如,如果您想要一个递归/嵌套的保护对象,它知道它有多少层深度但没有空间开销(我知道是迂腐的)或消除一些运行时开销。不过,这变成了一种学术上的好奇心……

像这样的例子:

template <unsigned depth>
class guard {
unsigned get_depth() const {return depth;}
};

guard<2> g2;
std::cout << reinterpret_cast< guard<5>* >( &g2 )->get_depth(); // works? crazy? useful?

我一辈子都想不出这样做的正当理由,但它让我思考这是否是合法的 C++ 以及编译器应该如何处理这样的事情(如果它可以的话)或者它是否是只是彻头彻尾的愚蠢。

我假设因为在编译时需要知道转换目标,相关模板已为转换实例化。有没有人发现这样有用的东西,假设它确实有效并且有用途,如果是这样,可以在哪里使用它?

我猜想的一般问题是reinterpret_cast 可以改变常量模板参数吗? 如果是这样,这只是一个类型 hack(需要一个更好的术语)和 在这种情况下,g2总是 返回2(在转换之后)?还是应该返回 5(转换后)?

最佳答案

这是未定义的,但不是因为严格的别名规则。对 get_depth 的调用既不会读取也不会修改任何对象的值(模板非类型参数不是对象),因此它不会访问(定义为在 [defns.access] 中)严格别名规则含义内的任何内容。

这由 [class.mfct.non-static]/2 控制:

If a non-static member function of a class X is called for an object that is not of type X, or of a type derived from X, the behavior is undefined.

关于重新解释模板参数常量的 C++ 编译器行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40530874/

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