隐式实例化类中已删除函数的重定义问题咨询
隐式实例化类中已删除函数的重定义问题咨询
嘿,我最近在研究C++模板实例化的相关规则时,遇到了一个很值得探讨的例子,咱们一起来拆解一下:
template<class T> struct C { void f() { T x; } void g() = delete; }; C<void> c; // OK, definition of C<void>::f is not instantiated at this point template<> void C<int>::g() { } // error: redefinition of C<int>::g
咱们来逐个分析这两行代码:
- 第一行
C<void> c;是完全合法的:虽然C<void>::f()里试图定义T x(也就是void x),这在语法上是不成立的,但这里只是隐式实例化类C<void>,而成员函数的定义只有在被调用或者需要其定义的时候才会被触发实例化,所以C<void>::f()的定义并不会被执行,因此这行代码能正常通过编译。 - 第二行
template<> void C<int>::g() { }就会触发错误:当我们隐式实例化C<int>时(哪怕没显式声明C<int>的对象),类里的void g() = delete;已经作为C<int>::g()的定义存在了,现在试图给它写一个显式特化的定义,就相当于对同一个函数进行了重复定义,所以编译器会直接报错。
备注:内容来源于stack exchange,提问作者YurkoFlisk
相关产品推荐
相关产品推荐

