构造函数和函数中的CPP参考

Pra*_*ani 4 c++ pass-by-reference lvalue rvalue-reference

对下面的代码有点困惑.`

class sample
{
     public:
     sample() {  }
     sample( sample& Obj ) {  }
 };

void fun( sample& Obj ) {   }

int main()
{
    sample s(sample());
    fun( sample() );
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到以下错误

由于以下错误导致编译失败.main.cpp:在函数'int main()'中:main.cpp:29:19:错误:从'sample'fun(样本())类型的右值开始,无效初始化'sample&'类型的非const引用;

我理解将样本和obj中的参数更改为const sample&obj将解决错误.

我的问题是,即使对于复制构造函数,也发送了一个临时对象.但是为什么编译器没有抛出相同的错误.

不错的解释是最受欢迎的

关心Prasath S.

Zeb*_*ish 6

这一行:

sample s(sample());
Run Code Online (Sandbox Code Playgroud)

是一个名为s的函数声明,它返回一个示例对象,并将一个不带参数的函数作为参数,并返回一个示例对象.你根本没有调用复制构造函数.它被称为"最令人烦恼的解析".虽然有些人反对这个名字.

你可以通过写入控制台或在复制构造函数中放置断点来看到这种情况,它永远不会被调用.您将看到的另一件事是向您的类添加变量成员并尝试访问它将无法正常工作.行后:

sample s(sample());
Run Code Online (Sandbox Code Playgroud)

尝试使用:

s.sampleMember = 1;
Run Code Online (Sandbox Code Playgroud)

并且它将无法编译,理由是s是函数声明而不是对象.有两种方法可以避免这种情况,您可以在另一组括号中包围该参数:

sample s((sample()));
Run Code Online (Sandbox Code Playgroud)

或者您可以使用C++ 11向前样式括号初始化,例如:

sample s(sample{});
Run Code Online (Sandbox Code Playgroud)