部分答案在这里给出
class foo1
{
private:
int i;
public:
foo1()
{
i=2;
}
int geti(){
return i;
}
};
class foo2
{
private:
int j;
public:
explicit foo2(foo1& obj1) //This ctor doesn't have `const` intentionally as i wanted to understand the behavior.
{
cout<<"\nctor of foo2 invoked";
j=obj1.geti();
}
};
foo1 obj1;
foo2 obj2(obj1); //THIS WORKS
foo2 obj22=obj1; //THIS DOESN'T WORK
当钥匙explicit
被移除时,它们都可以工作。
以下解释对于复制初始化 ( foo2 obj22=obj1
) 是否正确:
首先编译器使用构造函数创建一个临时对象:
foo2(foo1& other) {}
然后它尝试在复制构造函数中使用这个临时对象:
foo2(foo2& other) {}
但它可能不会将临时对象绑定到非常量引用并发出错误。当您使用等号时,就会使用所谓的复制初始化。
如果是,那么foo2(foo1& other) {}
在更进一步之前不应该禁止它本身,因为临时不能绑定到非 const 引用?
抱歉,这个问题很长,我的困惑基本上是在存在/不存在显式关键字(带/不带 const)的情况下直接初始化和复制初始化的差异行为