为什么构造函数在某些情况下不起作用?

anu*_*amb 1 c++ constructor

我有一个类定义.我对一些构造函数行为感到困惑.以下是代码.

#include <iostream>
#include <cstdlib>

using namespace std;

class A
{
  int i;
public:
  void seti(int v) {cout << "Setting i\n"; i=v;}
  void print() {cout << "i = " << i << endl;}
  A(){};
  A(int v) {cout << "Setting i in par-ctor to " << v << "\n"; i=v;}
  A(A& o) {cout << "In copy ctor, changing i to " << o.i << "\n";i=o.i;}
  A& operator=(A o) {cout << "In assignment op\n"; this->i = o.i; return(*this);}
};

int main()
{
  A o1;
  A o2(2);
  A o3 = A(4);
  A o4 = 35;

  return(0);
}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么这个代码不能编译,除非

a)已定义的复制构造函数被注释,或

b)定义的复制构造函数有一个'const'限定符,如A& A(const A& o)

c)删除o3和o4的对象初始化.

关于(c)期望调用构造函数A(int),

实际的复制构造函数定义(没有const)与参数化(带有int)构造函数有什么冲突?

Jos*_*eld 6

首先看这里:

A o3 = A(4);
Run Code Online (Sandbox Code Playgroud)

A(4)创建一个临时的对象.这个表达式是一个右值.右值不能绑定到非const左值引用A&,因此无法选择复制构造函数.一个更好的复制构造函数声明有一个const A&,所以它也可以从rvalues构造.这就是你(b)修复工作的原因.

同样的问题在这里表现出来:

A o4 = 35;
Run Code Online (Sandbox Code Playgroud)

在复制初始化(带有=)中,构造对象的临时对象,然后将其复制到您声明的对象中.所以这相当于:

A o4 = A(35);
Run Code Online (Sandbox Code Playgroud)

因此表现出与上述相同的问题.