考虑这个例子:
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
不是从属名称,它的成员应该在模板定义时正常检查。有没有我看不到的细微差别?
最佳答案
这些预实例化消息不是标准强制执行的,而是取决于编译器
n3337 § 14.6 - 8
No diagnostic shall be issued for a template definition for which a valid specialization can be generated. If no valid specialization can be generated for a template definition, and that template is not instantiated, the template definition is ill-formed, no diagnostic required.
强调我的
关于c++ - g++ 未报告未实例化模板中的某些错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35126705/