加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – VC是否符合有关警告C4407的标准?

发布时间:2020-12-16 07:10:42 所属栏目:百科 来源:网络整理
导读:以下源代码在VC中生成警告C4407,编译器确实生成了错误的代码. struct A1 { int a1;};struct A2 { int a2;};struct B: A1,A2 { void f() { std::cout this 'n'; }};int main() { B b = B(); void (B::*pb)() = B::f; void (A2::*pa)() = (void (A2::*)())pb;
以下源代码在VC中生成警告C4407,编译器确实生成了错误的代码.

struct A1 {
    int a1;
};

struct A2 {
    int a2;
};

struct B: A1,A2 {
    void f() {
        std::cout << this << 'n';
    }
};

int main() {
    B b = B();
    void (B::*pb)() = &B::f;
    void (A2::*pa)() = (void (A2::*)())pb;  // performs static_cast actually
    std::cout << (std::uintptr_t&)pb << 'n';
    std::cout << (std::uintptr_t&)pa << 'n';
    B* pB = &b;
    A2* pA = pB;
    std::cout << pB << 'n';
    std::cout << pA << 'n';
    (pB->*pb)();
    (pA->*pa)();
}

生成的代码不正确,因为在调用pa时不调整指针pA,导致f中的指针值错误.但是,代码在GCC和clang中编译良好而没有任何警告(严格别名除外).指针pA在GCC和clang生成的代码中进行了适当调整.所以,我想知道标准对此有何看法?上述代码中的演员是否按照标准罚款?或者它是GCC和clang的非标准扩展?

解决方法

根据评论 – 这实际上是MSVC的非标准扩展 – GCC和CLang都默认正确处理.任何看到此内容的人都应该在其编译器命令行上使用/ vmg开关来禁用MSVC扩展,该扩展允许简单继承层次结构中的“压缩”PMF.不幸的是,该开关的文档非常神秘 – 它的相对 /vmv以一种方式记录,可以提供更多关于实际情况的见解.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读