【发布时间】:2015-05-01 12:56:48
【问题描述】:
关于此主题的先前问题:
这是我最近提出的问题的后续: clang: no out-of-line virtual method definitions (pure abstract C++ class) 并且被标记为这个问题的重复:What is the meaning of clang's -Wweak-vtables?。我不认为这回答了我的问题,所以我在这里专注于让我困惑且尚未得到解答的问题。
我的场景:
我正在尝试使用 Clang-3.5 编译以下简单的 C++ 代码:
test.h:
class A
{
public:
A();
virtual ~A() = 0;
};
test.cc
#include "test.h"
A::A() {;}
A::~A() {;}
我用来编译这个的命令(Linux,uname -r: 3.16.0-4-amd64):
$clang-3.5 -Wweak-vtables -std=c++11 -c test.cc
我得到的错误:
./test.h:1:7: warning: 'A' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit [-Wweak-vtables]
当 A 类不是纯抽象时,上面的代码构建得很好。以下代码不会发出警告,唯一的变化是类 A 不再是抽象的:
test2.h:
class A
{
public:
A();
virtual ~A();
};
test2.cc
#include "test2.h"
A::A() {;}
A::~A() {;}
我的问题
纯抽象类有什么特别之处,以至于上面的代码会在 Clang 中触发警告?
【问题讨论】:
-
在您的第二个示例中,
A根本不是抽象的 -
如果您没有定义
A::~A,您认为会发生什么?然后,如果编译器等待看到A::~A的定义来发出vtable,那么就没有vtable! -
@immibis 这是正确的行为,不是吗? (包括test2.h在内的其他TU也会得出同样的结论)
标签: c++ clang abstract-class clang++ llvm-clang