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 所讨论的那样。基本上你有两个选择:

    使用/vmgcompiler 开关(这会增加二进制文件的大小)。 通过基类&amp;B::i获取正确的偏移量并将其分配给派生类A

【讨论】:

以上是关于VS2015 Update 2 中指向非静态数据成员的指针不正确的主要内容,如果未能解决你的问题,请参考以下文章

vs2015 update2 有啥用

体验VS2015 Update 2 的 Android 和 Python

在 VS2015 Update 3 中构建 OpenCV 3.2 时 xtr1common 中出现大量错误

VS提示“非静态的字段,方法或属性要求对象引用”

VS 2015 update2 装xamarin后,编辑axml文件无智能提示的解决方法。

TSX 文件中无法识别 React.js 代码(VS 2015 Update 1 RC)