2017-09-13 233 views
4

只要用于访问成员指针的指针是正确类型,以下是否会导致未定义的行为?将指针派生类成员变量转换为指向基类成员变量的指针是否合法?

如果是这样,为什么我需要演员?如果没有它,它会看起来好多了(是的,我知道这只是一个意见问题)。

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)); 
} 
+0

我还没有试图解决问题。我最近开始使用一些广泛使用它的代码,并且这种模式根本不适合我。 – evan

回答

6

是否被用于访问指针到构件下面导致未定义的行为,只要该指针是一个正确的类型?

不,它的结构良好。从[expr.mptr.oper]开始的规则是:

如果E1的动态类型不包含E2引用的成员,则行为是未定义的。

的的*thisdynamic typesub,其确实包含成员,所以这是好的。

如果是这样,为什么我需要演员?

因为它是一个天生是不安全的演员,和经验法则是,本身就是不安全的操作应该是响亮,可见。在这个特定的情况下,这很好,但那只是因为你小心。要求施放迫使你不得不考虑它。

一个简单的例子可能只是看指针而不是指向成员的指针。在一个简单的层次结构中(假设公开,不含糊等),将Derived*转换为Base*总是安全的。这里没有问题,所以你不需要写剧情。但是,将Base*转换为Derived*并不总是安全的......您可能没有Derived*那里。但是,这不是从来没有安全 - 不允许投完全是坏事。所以安全演员是隐含的,但不安全演员必须是明确的。

+0

谢谢,我不得不争论它的内在不安全性,以使它改变,因为我不能使用UB参数。 – evan

+0

@evan Huh?为了得到改变? – Barry

+0

不是标准。我最近开始使用的代码。 – evan