n. *_* m. 12 c++ templates g++
考虑这个例子:
class A
{
void foo();
public:
void bar();
};
template <class> class B
{
B()
{
A a;
a.foo(); // 1
A::bar(); // 2
a.bar(1); // 3
}
};
Run Code Online (Sandbox Code Playgroud)
注意B永远不会被实例化.
clang++报告所有三条标记的行都是错误的.g++(4.8.3)接受行1,2并且仅报告行3.
如果B实例化,请g++愉快地将所有三行报告为错误.
这是一个g++错误吗?有人会这么认为.A不是依赖名称,应在模板定义时正常检查其成员.我看不到细微差别吗?
Mar*_* A. 19
这些预实例化消息不是由标准强制执行的,而是由编译器决定的
n3337§14.6 - 8
不能为可以生成有效特化的模板定义发出诊断.如果无法为模板定义生成有效的专业化,并且未实例化该模板,则模板定义格式错误,无需诊断.
强调我的
小智 7
这是不可能的,一般启齿a.foo();或者A::bar();是在模板定义时出现错误,甚至对那些具体定义A::foo和A::bar.
一般来说,a.foo();如果A有一些特殊的B<T>朋友,而不是其他人,这可能是有效的,这将使有效性依赖于模板参数.
一般来说,A::bar();如果可以有效B<T>不得不A直接或间接地作为基类,和模板类的模板定义的时间一般不知道自己的基类呢.
尽管可以在这里检测到这些都不可能(A没有朋友,B<T>也没有基础),但需要付出很大的努力才能获得很少的好处.因此,在实例化时总是执行此类检查是有意义的,这就是GCC采用的方法.
C++中实际上没有规则要求在模板定义时进行诊断(正如Marco A.的答案正确指出的那样).只有在实例化模板时,模板定义中的任何错误都会导致程序格式错误,需要诊断,每2.2p1子弹点8:
如果任何实例化失败,程序将是格式错误的.
在您的程序中,没有实例化,因此没有实例化失败.
| 归档时间: |
|
| 查看次数: |
413 次 |
| 最近记录: |