class A {};
class B { public: B (A a) {} };
A a;
B b=a;
Run Code Online (Sandbox Code Playgroud)
从技术上讲,这是一个复制构造函数在这里应用的创建b?
CB *_*ley 14
是的,从理论上讲.这是复制初始化.首先,B从initializer(a)构造一个临时实例,然后b通过复制构造函数从该临时实例初始化.
但是,允许编译器(通常也会)忽略临时和复制结构,并b直接a使用B(A)构造函数构造.
从技术上讲,这是一个复制构造函数,在这里应用于创建b?
是的......但可能不是你的想法. A在创建b时调用了复制构造函数,以便将参数的值传递A a作为B构造函数的参数.
但是,它没有在创建b时运行B的复制构造函数.
编辑:每天都学到新东西.显然,更具技术性,正如@CharlesBailey指出的那样......如果使用B b = a;语法("复制初始化")而不是B b (a);语法("直接初始化"),可能需要创建类型B的临时值.此时B的拷贝构造函数最终会被调用.
研究这种现象有点困难,但Charles指出gcc有一个-fno-elide-constructors选项(也就是:Copy Elision上的维基百科)@ JesseGood的链接有一个详尽的解释和一些演示代码: