C++ 为什么我不能打电话给';显式C(常数C&;)&x27;?

C++ 为什么我不能打电话给';显式C(常数C&;)&x27;?,c++,C++,我不明白为什么行返回(const C&)cc不起作用 这是一个代码和错误的粘贴 #include <stdio.h> class C { public: int i; explicit C(const C&) // an explicit copy constructor { printf("\nin the copy constructor"); } explicit C(int i ) // an exp

我不明白为什么行
返回(const C&)cc不起作用

这是一个代码和错误的粘贴

#include <stdio.h>

class C 
{
public:
    int i;
    explicit C(const C&)   // an explicit copy constructor
    {
        printf("\nin the copy constructor");
    }
    explicit C(int i )   // an explicit constructor
    {
        printf("\nin the constructor");
    }

    C()
    {
        i = 0;
    }
};

class C2
{
public:
    int i;
    explicit C2(int i )   // an explicit constructor
    {
    } 
};

C f(C c)
{   // C2558
//    c.i = 2;
//    return c;   // first call to copy constructor
C cc;
return (const C&)cc;
}

void f2(C2)
{
}

void g(int i)
{
//    f2(i);   // C2558
    // try the following line instead
     f2(C2(i));
}

int main()
{
    C c, d;
    d = f(c);   // c is copied
}
#包括
C类
{
公众:
int i;
显式C(const C&)//显式复制构造函数
{
printf(“\n在复制构造函数中”);
}
显式C(int i)//显式构造函数
{
printf(“\n在构造函数中”);
}
C()
{
i=0;
}
};
C2类
{
公众:
int i;
显式C2(int i)//显式构造函数
{
} 
};
C f(C C)
{//C2558
//c.i=2;
//返回c;//对复制构造函数的第一次调用
C cc;
返回(常数C&)cc;
}
空隙f2(C2)
{
}
无效g(内部i)
{
//f2(i);//C2558
//试试下面这行
f2(C2(i));
}
int main()
{
C,d;
d=f(c);//复制了c
}
输出:

在函数“cf(C)”中:第36行:错误: 没有用于调用的匹配函数 'C::C(const C&)'编译 由于-Wfatal错误而终止

尝试:


这是对复制构造函数的显式调用。转换到引用是不正确的。

第36行要求隐式调用复制构造函数,您出于某种原因声明了显式调用。 删除副本上的显式标记,您就可以了。
将其置于
C::C(int)
上是有意义的调用显式复制构造函数的示例:


当然,pass-by-value和return-by-value总是隐式调用copy构造函数,因此显式声明copy构造函数将防止这种情况发生(不一定是坏事)。

我认为这不应该起作用。它创建一个显式副本,而该副本又需要隐式复制到返回值中。您可以编辑该行并点击submit,它将显示错误代码。它不起作用。也许显式调用复制构造函数是不可能的?也许这是不可能的。我试过
const C&cc=ccc;返回C::C(cc)未成功。示例似乎取自此链接。这里提到要删除显式关键字以供程序编译。您还可以通过显式复制构造函数来解释您想要解决的问题吗?我不熟悉那个成语,它只是一个实验。我试图弄清楚如何调用显式复制构造函数。这似乎不可能。哦,我明白了!它不是事实上的线,而是它的价值是不考虑显式返回的事实。我现在完全明白了。
return C(cc);