前向声明的类的成员函数指针

时间:2014-03-05 08:23:04

标签: c++ visual-c++ undefined-behavior

标头common.h forward声明一个类Test和一个接收成员函数指针的函数:

class Test;

void func(const Test &t, int (Test::*f)() const, int x, int y);

在源文件target.cpp中,我定义了

这样的函数
#include "common.h"

void func(const Test &t, int (Test::*f)() const, int x, int y) {
    std::cout << "f: " << (t.*f)() << ", x: " << x << ", y: " << y << std::endl;
}

在我的主文件中,我定义了类Test并使用函数func

class Test {
public:
    int example() const { return 1; }
};

#include "common.h"

int main() {
    Test t;
    func(t, &Test::example, 0xaaaaaaaa, 0xbbbbbbbb);
    return 0;
}

显然这有点臭,因为指向成员函数的指针有时不仅仅是一个简单的指针。但是产生的行为有点压倒性:给定的参数0xaaaaaaaa0xbbbbbbbb将无法正确传递给函数。或者更确切地说,函数func解释给定堆栈的方式与调用者在堆栈上推送数据的方式不同。 f的大小取决于该类是仅向前声明还是实际定义。使用Visual Studio 2013编译的输出是:

f: 1, x: 0, y: 2130567168

我想,如果前向声明就足够了,真的无论是否有定义都无关紧要。

1 个答案:

答案 0 :(得分:5)

默认情况下,MSVC通过指向成员的指针来支持速度优于正确性。您可以通过传递编译器标志/vmg强制它按照标准工作。