【发布时间】:2020-02-08 21:03:57
【问题描述】:
编译以下代码会给出“未定义的对 `A::~A() 的引用”:
#include <cstdlib>
#include <memory>
template <typename T>
struct A {
A() {}
~A() {}
};
struct Aggregate {
using key_vector = A<char>;
using value_vector = A<int>;
value_vector vals;
key_vector keys;
};
int
main()
{
auto x = malloc(sizeof(Aggregate));
new (x) Aggregate{};
return 0;
}
问题出现在 clang 7.0 和 6.0(可能还有一些旧版本)。见:https://godbolt.org/z/GNPk3V
在较新的 clang 版本和 gcc 上它工作正常。
这是预期的还是clang中的某种错误?
【问题讨论】:
-
如果它有帮助,两个独立的东西分别消除了错误:使用一些 -O 级别编译;并在从
main返回之前插入((Aggregate*)x)->~Aggregate();。不要问我为什么他们中的任何一个都有效。 -
或
= default析构函数。或将其全部删除,因为它是空的。我不知道为什么会发生这种情况,但它不应该出现在调用析构函数并删除内存的实际代码中。 -
~A() = 默认;
-
如果它不再发生,那么我会认为这是一个已修复的错误。
标签: c++ linker compiler-construction clang