【发布时间】:2019-12-16 09:16:52
【问题描述】:
我试图理解下面的代码sn-ps
片段 #1
template <typename T>
struct A
{
static constexpr int VB = T::VD;
};
struct B : A<B>
{
};
gcc9 和 clang9 都不会在这里抛出错误。
问。为什么这段代码会编译?从B继承时我们不是实例化A<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'”。
问。如果这里的 struct B 不完整,那为什么在 sn-p #2 中不完整呢?
使用的编译器标志:-std=c++17 -O3 -Wall -Werror。提前致谢!!!
【问题讨论】:
-
@xception 不是
struct B用B实例化A吗? -
clang9 抛出错误,提示“B 中没有名为 AD 的成员”。因为
B不完整......但不确定何时应该实例化成员...... -
@MutableSideEffect 哦,是的,我的错,也将其作为模板阅读:(
-
我已将此问题标记为“需要更多关注”,并且该问题确实包含多个问题(因此得出我的结论),那么为什么我的标记错误?
-
@Dominique 好像是used as an audit 15 times so far。这些审计中只有一项失败了。根据下面的答案,看起来子问题是紧密耦合的,因为它们是关于非常相似的事情(即探索same section of the specification 的不同方面)。但是,我不是主题专家,所以我会听从 wrt 的人。决定子问题是否紧密耦合,以免问题过于宽泛。
标签: c++ templates language-lawyer