【发布时间】:2018-08-03 21:27:57
【问题描述】:
当我从 union 的模板化基类继承并对其进行部分特化时,MSVC 上的编译失败,因为禁止将 unions 作为基类(参见 1)。
但是,如果我将struct 用作我继承自的主模板,并且仅将union 用于部分专业化,它可以让我很好地编译它。
我很好奇为什么会这样。另外我想知道下面的代码 (2) 是符合标准还是 MSVC 只允许我绕过标准。
(1) C++ 标准(10.4 联合 [class.union])
"联合可以有成员函数(包括构造函数和 析构函数),但它不应具有虚拟(10.6.2)函数。一种 union 不应有基类。 工会不得用作 基类。”
(2) 示例 (godbolt.org)
//template <typename T, std::size_t Size>
//↓ ↓ clearly illegal
//union vector_base {
// vector_base() : data() {}
// std::array<T, Size> data;
// }
template <typename T, std::size_t Size>
//↓ legal now?
struct vector_base
{
std::array<T, Size> data;
};
template <typename T>
union vector_base<T, 2>
{
std::array<T, 2> data;
struct { T x, y; };
};
template <typename T, std::size_t Size>
class vector : public vector_base<T, Size> {
};
【问题讨论】:
-
我认为您发现了一个 MSVS 错误/“功能”。 AFAIK,您不能专门化具有不同类类型的模板(从
struct到union) g++ 和 clang 都无法编译:godbolt.org/g/3VDzPM -
@NathanOliver:有趣的是,g++ 在这里抱怨别的东西(部分专业化是
union而不是struct)。如果你通过-fpermissive,代码编译(带有警告)。 -
你真的需要
x成员而不是getterT& x() { return data[0]; }吗?
标签: c++ templates template-meta-programming