2

这就是我最初所做的。

class A
{   public:
    A()         { std::cout << "\ndefault constructor";     }
    A(const A&) { std::cout << "\ncopy constructor";        }
    A(int)      { std::cout << "\nconversion constructor";  }
};

A a0;           // print default constructor
A a1(a0);       // print copy constructor       note : direct initialization
A a2 = a0;      // print copy constructor       note : copy initialization
A a3(123);      // print conversion constructor     note : direct initialization
A a4 = 123;     // print conversion constructor     note : copy initialization (create a temp object from int)

但是,如果将 A 类稍微修改如下(删除复制构造函数中的 const),为什么最后一行会出现编译错误?谢谢你

class A
{   public:
    A()         { std::cout << "\ndefault constructor";     }
    A(A&)       { std::cout << "\ncopy constructor";        }
    A(int)      { std::cout << "\nconversion constructor";  }
};

A a0;           // print default constructor
A a1(a0);       // print copy constructor       note : direct initialization
A a2 = a0;      // print copy constructor       note : copy initialization
A a3(123);      // print conversion constructor     note : direct initialization
//A a4 = 123;   // compile error
4

2 回答 2

5
A a4 = 123;

相当于

A a4 = A(123); // The RHS is a temporary A object.

这适用于第一种情况,因为有一个构造函数将 aA const&作为参数类型。

如果参数类型是 ,那将不起作用A&。当参数类型是时可以使用临时对象A const&,而不是A&

于 2016-11-19T05:23:20.340 回答
2

对于这种情况A a4 = 123;,在构造对象“a4”时,语句

A a4 = 123;

被编译器分解为

A a4 = A(123);

在上面的语句中,一个参数构造函数 ieA(int)用于将整数值“123”转换为临时对象,并且使用复制构造函数将该临时对象复制到对象“a4”。C++ 不允许通过非常量引用传递临时对象,因为临时对象是不能绑定到非常量引用的右值。

所以,一般来说,如果你没有使用 const 限定符传递你的参数,那么你就不能创建 const 对象的副本。

为了更好地理解,再举一个类似的例子:

class Test
{
   /* Class data members */
public:
   Test(Test &t) { /* Copy data members from t*/}
   Test()        { /* Initialize data members */ }
};

Test fun()
{
    cout << "fun() Called\n";
    Test t;
    return t;
}
int main()
{
    Test t1;
    Test t2 = fun();  //compilation error with non-const copy constructor
    return 0;
}

$g++ -o main *.cpp
main.cpp: In function ‘int main()’:
main.cpp:22:18: error: cannot bind non-const lvalue reference of type ‘Test&’ to an rvalue of type ‘Test’
     Test t2 = fun();
               ~~~^~
main.cpp:8:4: note:   initializing argument 1 of ‘Test::Test(Test&)’
    Test(Test &t) { /* Copy data members from t*/}
    ^~~~
于 2016-11-19T18:30:10.543 回答