【发布时间】:2014-07-24 12:22:29
【问题描述】:
考虑这个例子:
class A
{
void foo();
public:
void bar();
};
template <class> class B
{
B()
{
A a;
a.foo(); // 1
A::bar(); // 2
a.bar(1); // 3
}
};
注意B 永远不会被实例化。
clang++ 将所有三个标记的行报告为错误。 g++ (4.8.3) 接受行 1 和 2 并且只报告行 3。
如果 B 被实例化,g++ 很高兴将所有三行报告为错误。
这是g++ 错误吗?有人会这么认为。 A 不是从属名称,应在模板定义时正常检查其成员。有没有我看不到的细微差别?
【问题讨论】:
-
1 可以通过
friend声明对专业化有效,通过派生A可以使 2 对于专业化有效,而 3 永远不能对专业化有效。 -
@SanderDeDycker
A不是模板,它的所有朋友(没有)都是已知的。B当然可以有一个派生自A的专业化,但是这个B::B不会是该专业化的成员。 -
我的想法与hvd's answer 相同。 IE。检查 1 和 2 是否无效比检查 3 是否无效更难,并且由于不需要错误,因此可以接受最小的努力。