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