C++ Visual Studio bug还是未定义的行为?
以下代码在gcc中运行良好,但在Visual Studio 2017和2015中均失败。我没有试过其他编译器。错误发生在运行时而不是编译时C++ Visual Studio bug还是未定义的行为?,c++,visual-studio,C++,Visual Studio,以下代码在gcc中运行良好,但在Visual Studio 2017和2015中均失败。我没有试过其他编译器。错误发生在运行时而不是编译时 #include <cassert> #include <iostream> class ListHook { }; template<typename Node, ListHook Node::*memberPtr> struct MemberHookSpec { static ListHook* hookF
#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));
}
#包括
#包括
类ListHook
{
};
模板
结构成员规范
{
静态ListHook*hookFromNode(节点*Node)
{
返回&(节点->*memberPtr);
}
};
类对象
{
私人:
链钩;
公众:
使用HookSpec=MemberHookSpec;
虚拟~Object(){}/VisualStudio是一个IDE,它绝对不是VisualStudio中的一个bug。它是代码相关的,因此它可能是C++编译器中的一个bug,但它绝对不是VS中的一个bug。我可以看到编译器为什么会遇到这样的问题:计算成员的偏移量取决于该类是否具有VTABLE,并且成员类型通常是SOMET。可以在第一次通过时立即进行计算,并且不需要完整的类信息。但所有这些都是实现细节。当然,我没有看到任何禁止此代码的内容。看起来像是一个相当明显的编译器错误。模板显然返回指向类实例的m_hook
成员的指针;以及此cla是否SS有一个虚拟析构函数,与否,与这个类实例成员的指针是否等于一个指向同一类实例的成员的指针没有关系。因为VisualStudio是IDE,它绝对不是VisualStudio中的一个bug。它是代码相关的,因此它可能是C++编译器中的一个bug,但它绝对不是B。ug在VS中,我可以理解为什么编译器会遇到这样的问题:计算成员的偏移量取决于类是否有vtable,并且成员类型通常可以在第一次传递时立即计算,不需要完整的类信息。当然,所有这些都是实现细节。我什么也看不到禁止此代码。看起来像是一个相当明显的编译器错误。模板显然返回指向类实例的m_hook
成员的指针;而该类是否具有虚拟析构函数,与指向该类实例的成员的指针是否等于指向同一类实例的sam的指针无关e成员。