"vtable"链接器错误(涉及带有"= default"的虚拟析构函数) - Clang 3.1中的潜在错误?

Den*_*hie 6 c++ gcc llvm clang

我的代码中出现了链接器错误.我已经确定了下面的基本要点.

此代码为链接器提供错误"vtable for Foo",引自:Foo :: Foo()

class Foo {
public:
  Foo();
  virtual ~Foo() = default;
};
Foo::Foo() { }
Run Code Online (Sandbox Code Playgroud)

但是这段代码没有给出任何错误:

class Foo {
public:
  Foo();
  virtual ~Foo() { }
};
Foo::Foo() { }
Run Code Online (Sandbox Code Playgroud)

为什么?我认为这= default应该与那些空方括号基本上做同样的事情.

更新:我使用的是"Apple LLVM编译器4.1",它是Xcode 4.5.2的一部分.它可能是这个编译器中的错误吗?它可能适用于最新的GCC(Apple不再发售).有关编译器的讨论,请参阅下面的注释.

更新2:如下所述,更改行以virtual inline ~Foo() = default;消除此错误.这难道不是仅仅是一个错误?看起来编译器在没有明确写出的情况下不识别内联函数inline.

Koc*_*cka 1

它适用于 g++ 4.7.2。但我在 clang 3.1 上遇到了和你一样的问题。

我有3个文件。

Foo.h:

#ifndef FOO_H
#define FOO_H

class Foo {
public:
  Foo();
  virtual ~Foo() = default;
};

#endif // FOO_H
Run Code Online (Sandbox Code Playgroud)

Foo.cpp:

#include "Foo.h"

Foo::Foo() { }
Run Code Online (Sandbox Code Playgroud)

主要.cpp:

#include <iostream>
#include "Foo.h"

using namespace std;

int main()
{
    Foo foo;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但如果是这样,它也适用于 clang:

Foo.cpp 为空。

主程序

#include <iostream>
#include "Foo.h"

using namespace std;

Foo::Foo() { }

int main()
{
    Foo foo;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以我猜 clang 在生成对象文件期间有错误。