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 以一种方式记录,可以提供更多关于实际情况的见解.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |