C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – VC是否符合有关警告C4407的标准?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
以下源代码在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的非标准扩展?

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

大佬总结

以上是大佬教程为你收集整理的c – VC是否符合有关警告C4407的标准?全部内容,希望文章能够帮你解决c – VC是否符合有关警告C4407的标准?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。