eva*_*van 4 c++ language-lawyer
只要用于访问指向成员的指针的类型正确,以下是否会导致未定义的行为?
如果是这样,为什么我需要演员呢?没有它会看起来好多了(是的,我知道这只是一个意见问题).
struct base {
int foo(int base::* ptr) {
return this->*ptr;
}
};
struct sub : base {
int blah{ 42 };
};
int main() {
return sub{}.foo(static_cast<int base::*>(&sub::blah));
}
Run Code Online (Sandbox Code Playgroud)
只要用于访问指向成员的指针的类型正确,以下是否会导致未定义的行为?
不,它很好.来自[expr.mptr.oper]的规则是:
如果E1的动态类型不包含E2引用的成员,则行为未定义.
的动态型的*this是sub,它不包含成员,所以这是好的.
如果是这样,为什么我需要演员呢?
因为它本身就是不安全的演员,而且经验法则是本质上不安全的操作应该是响亮而可见的.在这种特殊情况下,它很好,但这只是因为你很小心.要求施法迫使你必须考虑它.
一个更简单的例子可能是仅查看指针而不是指向成员的指针.在一个简单的层次结构中(假设是公共的,非模糊的等),将a转换Derived*为a 总是安全的Base*.那里没有任何问题,所以你不需要写演员.然而,把它投到Base*一个Derived*......你可能没有那个并不总是安全的Derived*.但是,它并非永远不会安全 - 完全不接受演员阵容会很糟糕.所以安全演员是隐含的,但不安全演员必须是明确的.
| 归档时间: |
|
| 查看次数: |
143 次 |
| 最近记录: |