Cha*_*eon 7 c++ constructor c++11
以下代码将构造函数从base转发为派生类.
为什么2个复制构造函数调用?在后台发生了什么?
用g ++编译.
#include <iostream>
using namespace std;
struct A {
A() { cout << "A" << endl; }
A(const A&) { cout << "A(const A&)" << endl; }
template<typename T> A(T a); // Needed to compile :-O
};
template<typename T>
struct C : public T { using T::T; };
int main()
{
A a;
C<A> ca(a);
//C<A> caa(ca);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
A
A(const A&)
A(const A&)
Run Code Online (Sandbox Code Playgroud)
通过定义构造函数模板A,C将给出具有类似签名的构造函数模板.它隐含地定义为:
template<typename T>
struct C : public T
{
//using T::T;
C() = default;
C(C const&) = default;
template<typename U> C(U a) : T( std::forward<U>(a) ) {}
};
Run Code Online (Sandbox Code Playgroud)
现在调用A两次复制构造函数:一次用于按值获取参数.第二次通话来自于T( std::forward<U>(a) )调用复制器A.这对我来说是令人惊讶的,因为你期望一个继承的 ctor调用它所继承的基类的确切ctor.但事实并非如此,重载决策选择的不是ctor模板A,而是普通复制器A(A const&)(见下文).
有趣的是,它并不关心构造函数模板的A作用,只需要声明它.这就是为什么在OP中,定义可能会丢失; 它也可以删除(这可能是一个缺陷?).
A只需在初始化的重载解析期间选择复制器T( std::forward<U>(a) ).这是这种情况:参数是类型的右值A,它可以直接绑定到const A&引用,如A的copy-ctor所要求的那样.由于引用绑定是直接的,没有派生到基本的转换, copy-ctor排名为完全匹配.ctor模板也A被排列为精确匹配,但由于在重载集中存在具有相同排名的模板和非模板函数,因此优选非模板函数(复制器A(A const&)).
| 归档时间: |
|
| 查看次数: |
270 次 |
| 最近记录: |