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