为什么构造函数在某些情况下不起作用
Why constructor does not work in some cases?
我有一个类定义。我对一些构造函数的行为感到困惑。代码如下:
#include <iostream>
#include <cstdlib>
using namespace std;
class A
{
int i;
public:
void seti(int v) {cout << "Setting in"; 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 opn"; this->i = o.i; return(*this);}
};
int main()
{
A o1;
A o2(2);
A o3 = A(4);
A o4 = 35;
return(0);
}
我想知道为什么这段代码不编译,除非
a)定义的复制构造函数被注释,或者b)定义的复制构造函数具有'const'
限定符,如A& A(const A& o)
或
c)移除o3和o4的对象初始化。
对于期望调用构造函数A(int)的(c),
实际的复制构造函数定义(没有const
的那个)如何与参数化的(带int的)构造函数冲突?
先看这里:
A o3 = A(4);
A(4)
创建临时对象。这个表达式是一个右值。右值不能绑定到非const
的左值引用(如A&
),因此不能选择复制构造函数。一个更好的复制构造函数声明有一个const A&
,这样它也可以从右值构造。这就是为什么你的(b)修复工作。
同样的问题出现在这里:
A o4 = 35;
在复制初始化(使用=
)中,构造对象的临时对象,然后将其复制到您声明的对象中。这相当于:
A o4 = A(35);
相关文章:
- G++ C++17 类模板参数推导在非常特殊的情况下不起作用
- EOF有更安全的替代方案吗?它在我的情况下不起作用
- c++ 选择排序在特定情况下不起作用
- 寻找有关为什么此C++代码在没有引用的情况下不起作用的解释
- 句子转换器在存在新行的情况下不起作用
- 为什么 std::void_t 在这种情况下不起作用
- C++中的dynamic_cast在没有 RTTI 的情况下不起作用;为什么?
- 为什么SFINAE在这种情况下不起作用?
- 运算符重载如何工作,为什么在我的情况下不起作用?
- 请帮助我理解为什么SFINAE在这种情况下不起作用
- 为什么#ifndef在这种情况下不起作用
- 为什么c_str在这种打开(文件名)的情况下不起作用
- ADL在特定情况下不起作用
- FillRect在某些情况下不起作用
- C++预处理器宏中的代码块在没有大括号的情况下不起作用
- 为什么cvPutText在这种情况下不起作用?
- Boost的ASIO + SSL在某些情况下不起作用
- 为什么贪婪的方法在这种情况下不起作用?
- 使用带有指针和文件的类概念 我的代码在第一种情况下不起作用,为什么?
- 为什么 std::function<boost::any ()> 在这种情况下不起作用?