Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;重新解释模板参数常量的编译器行为_C++_C++11_Reinterpret Cast - Fatal编程技术网

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

C++ C++;重新解释模板参数常量的编译器行为,c++,c++11,reinterpret-cast,C++,C++11,Reinterpret Cast,在处理RAII样式的保护对象时,我最终在模板参数中编码了一些保护状态。例如,如果您想要一个递归/嵌套的guard对象,该对象知道它有多少层,但没有空间开销(我知道这很迂腐),或者消除一些运行时开销,那么这似乎是合理的。不过,这变成了一种学术好奇心 类似的例子如下: template <unsigned depth> class guard { unsigned get_depth() const {return depth;} }; guard<2> g2; s

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

类似的例子如下:

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?
模板
班长{
无符号get_depth()常量{return depth;}
};
防护罩g2;
std::cout(&g2)->get_depth();//作品疯子有用吗?
我不能为我的生活想出一个合法的理由来做这件事,但它让我思考这是否是合法的C++,以及编译器应该如何处理这样的事情(如果它完全可以)或者如果它只是愚蠢的贯穿到底。 我假设,因为强制转换目标需要在编译时已知,所以为强制转换实例化了相关模板。有没有人发现这样有用的东西,假设它确实有用并且有用途,如果是的话,在哪里可以利用它


我想一般的问题是是否可以
重新解释\u cast
更改常量模板参数?
如果是,这只是一个类型hack(因为缺少更好的术语)并且
g2
在这种情况下总是返回
2
(在施法后)?或者它应该返回
5
(铸造后)?

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

而是通过以下方式进行控制:

如果为对象调用类
X
的非静态成员函数 这不是
X
类型,或者不是从
X
派生的类型,行为是 未定义


reinterpret\u cast
完全按照它的名字来做。你可以用它铸造一切。我知道它的作用,但我以前从未像这样使用过@πάνταῥεῖ: 因为“can”的某些价值@krzaq对我来说并不重要——通常我看到人们要么将OP ping为unaccept,要么将mod标记为delete。