为什么调用复制构造函数而不是转换构造函数
Why is copy constructor called instead of conversion constructor?
所以基本上这个代码:
class A {
};
class B {
B (const B& b) {}
public:
B (){}
B (const A& a) {}
};
int main()
{
A a;
B b1(a); //OK
B b2 = a; //Error
}
仅生成B b2 = a
的错误。而这个错误是
错误:"B::B(const B&)"是私有的
为什么除了直接转换构造函数之外,它还尝试调用复制构造函数?
从错误消息中可以清楚地看出,创建了一个临时B
,然后将其用于复制构造,但为什么呢?这在标准中在哪里?
B b2 = a;
这称为复制初始化。
它执行以下操作:
- 使用
B (const A& a)
从a
创建类型为B
的对象。 - 使用
B (const B& b)
将创建的临时对象复制到b2
。 - 使用
~B()
销毁临时对象。
您得到的错误不是在步骤 1 中,而是在步骤 2。
这在标准中在哪里?
C++03 8.5 初始值设定项
第14段:
....
— 如果目标类型是(可能符合 cv 条件的)类类型:
...
...
— 否则(即,对于剩余的复制初始化情况),如 13.3.1.4 中所述枚举用户定义的转换序列,这些转换序列可以从源类型转换为目标类型或(使用转换函数时)转换为其派生类,并通过重载分辨率 (13.3) 选择最佳转换序列。如果转换无法完成或不明确,则初始化格式不正确。使用初始值设定项表达式作为其参数调用所选函数;如果函数是构造函数,则调用将初始化目标类型的临时函数。然后,调用的结果(构造函数情况的临时结果)用于根据上述规则直接初始化作为复制初始化目标的对象。在某些情况下,允许实现通过将中间结果直接构造到正在初始化的对象中来消除此直接初始化中固有的复制;参见 12.2、12.8。
相关文章:
- 构造函数和转换运算符之间的重载解析
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- enable_if转换构造函数(静态强制转换,is_base_of)
- 参数包构造函数在类模板中隐藏用户定义的转换
- c++ 构造函数 将 1 个字符串参数转换为 3 个属性
- 复制构造函数隐式转换问题
- 没有合适的构造函数可以从"float"转换为"_D3DCOLORVALUE"
- 如果存在从"双精度"到"T"的转换,则禁用构造函数
- C++隐式构造函数转换,后跟类型向上转换
- 此语法中的构造函数转换错误
- C 操作员在具有构造函数转换时过载
- 如何在允许拷贝限制的同时禁用隐式构造函数转换
- 构造函数转换
- 通过构造函数转换容器
- C++ "没有合适的构造函数可以从<默认构造函数>转换为参数化构造函数
- 多个隐式构造函数转换
- (涉及显式)运算符和构造函数转换的优先级
- 构造函数转换如何在C++中工作
- 如何修复GCC编译中的const char *构造函数转换链错误
- 隐式构造函数转换的编译器优化