【发布时间】:2021-01-07 13:27:17
【问题描述】:
以下显式模板实例化导致编译器前端段错误在 LLVM clang++ 11.0 上 x86_64-pc-windows-msvc,使用带有 -std=c++17 的 clang-cl 接口,无论优化级别如何。
A.h
template <typename T>
class A
{
public:
T value;
static constexpr auto address = &A<T>::value;
};
extern template class A<float>;
A.cpp
#include "A.h"
template class A<float>;
请注意,由于 C++17 A::address 是一个内联变量,因此在这里使用 ODR 不会成为问题。
编译器的行为显然是错误的,我已经在 LLVM 错误跟踪器上提交了报告。 尽管如此,我仍然对代码的实际正确性感到好奇。
这是编译器错误处理的未定义行为,还是代码本身没有任何问题,仅与编译器有关。就我个人而言,我在显式模板实例化规范的标准中没有发现任何表明上述代码错误的内容。
我不认为上面是格式错误的,我错过了什么吗?
【问题讨论】:
-
无论输入如何,编译器都不应崩溃(即使这是正式允许的“未定义行为”),因此可能需要提交错误报告。
-
编译器崩溃是编译器错误,并没有说明代码的正确性。要解决编译器崩溃问题,您几乎必须进行猜测和测试。
标签: c++ templates language-lawyer clang++