我正在尝试了解以下代码片段
片段1
template <typename T>
struct A
{
static constexpr int VB = T::VD;
};
struct B : A<B>
{
};
gcc9和clang9都不会在此处引发错误。
问:为什么要编译此代码?A<B>
从B继承时,我们不是实例化吗?B中没有VD,因此编译器不应该在这里抛出错误吗?
片段2
template <typename T>
struct A
{
static constexpr auto AB = T::AD; // <- No member named AD in B
};
struct B : A<B>
{
static constexpr auto AD = 0xD;
};
在这种情况下,gcc9可以正常编译,但是clang9会引发错误,提示“ B中没有名为AD的成员”。
问:为什么用gcc9编译/为什么不用clang9编译?
片段3
template <typename T>
struct A
{
using TB = typename T::TD;
};
struct B : A<B>
{
using TD = int;
};
在这里,clang9和gcc9都会引发错误。gcc9说“无效使用了不完整类型'struct B'”。
问:如果这里的结构B不完整,那么为什么在代码段2中它不完整?
使用的编译器标志:-std=c++17 -O3 -Wall -Werror
。提前致谢!!!
B
是不完整的......但无法确定何时成员应该被实例化..
struct B
实例A
用B
?