以下代码适用于gcc,但在Visual Studio 2017和2015都失败。我没有尝试过任何其他编译器。错误是运行时而不是编译时。
#include <cassert>
#include <iostream>
class ListHook
{
};
template<typename Node, ListHook Node::*memberPtr>
struct MemberHookSpec
{
static ListHook* hookFromNode(Node* node)
{
return &(node->*memberPtr);
}
};
class Object
{
private:
ListHook m_hook;
public:
using HookSpec = MemberHookSpec<Object, &Object::m_hook>;
virtual ~Object() {} // <-- Triggers the issue.
void verifySameHook(ListHook* hook) const
{
bool const same_hook = (&m_hook == hook);
std::cout << "same hook: " << same_hook << std::endl;
assert(same_hook);
}
};
int main()
{
Object obj;
obj.verifySameHook(Object::HookSpec::hookFromNode(&obj));
}
预期行为是same_hook
为true
。在Visual Studio上它是false
。任何人都可以在代码中看到未定义的行为吗?如果没有,我将向微软报告一个错误。