VS2015 Update 2 中指向非静态数据成员的指针不正确
Posted
技术标签:
【中文标题】VS2015 Update 2 中指向非静态数据成员的指针不正确【英文标题】:Pointer to a non-static data members incorrect in VS2015 Update 2 【发布时间】:2016-04-27 09:50:38 【问题描述】:在 VS2015 更新 2 中的 C++ 编译器中似乎存在回归 - 当对具有虚拟析构函数的类之一使用多重继承时,计算的基类数据成员的地址不正确。代码示例:
// Example program
#include <iostream>
#include <limits>
struct V
virtual ~V() ;
;
struct B
int i;
;
struct A : public B, public V
;
int main()
int A::* a1 = &A::i;
A a;
a.i = std::numeric_limits<int>::max();
if (a.*a1 == std::numeric_limits<int>::max())
std::cout << "ok\n";
else
std::cout << "nok\n";
看起来 a1 获取到 v-table 的偏移量而不是 i。
此代码用于在 VS2015 中打印 ok 直到更新 1 和 nok 在更新 2 中。我在 GCC 和 Clang 中的检查也打印了 ok .
在使用指向成员的指针时,多重继承是否有任何限制?
【问题讨论】:
【参考方案1】:回答我自己的问题,以防有人遇到同样的问题:更新 2 中确实有一个regression,正如on MSDN forums 所讨论的那样。基本上你有两个选择:
-
使用
/vmg
compiler 开关(这会增加二进制文件的大小)。
通过基类&B::i
获取正确的偏移量并将其分配给派生类A
【讨论】:
以上是关于VS2015 Update 2 中指向非静态数据成员的指针不正确的主要内容,如果未能解决你的问题,请参考以下文章
体验VS2015 Update 2 的 Android 和 Python
在 VS2015 Update 3 中构建 OpenCV 3.2 时 xtr1common 中出现大量错误