【发布时间】:2020-07-19 03:51:35
【问题描述】:
自从阅读了 cplusplus 标准的一些引用后,我对从派生类类型转换基类类型感到困惑。此转换是否属于自定义转换?
引用一些让我对此感到困惑的引述:
[class.conv]/1 类对象的类型转换可以由构造函数和转换函数指定。这些转换称为用户定义的转换,用于隐式类型转换...
[class.conv.ctor]/3
非显式复制/移动构造函数 ([class.copy]) 是转换构造函数。
#include <iostream>
struct Base{
Base() = default;
Base(Base const&){}
};
struct Derived:Base{
};
int main(){
Derived d;
Base b = d; //from d to b, is this a user-defined conversion? Before reading the standard, I think it's not, but now I'm confused about this.
}
所以根据这些引用,派生类类型对象到基类类型属于用户定义的转换。如果我遗漏了标准中写的派生类类型到基类类型不属于用户定义转换的内容,请纠正我。
【问题讨论】:
-
我没有看到您引用的任何内容说派生到基础的转换是用户定义的。被视为转换构造函数的复制构造函数与派生到基转换的性质无关。毕竟,复制构造函数不进行派生到基的转换。那么为什么你认为这两个不相关的引用是相关的呢?
-
@NicolBolas 在代码中`Base b = d;`调用了Base::Base(Base const&),它是一个拷贝构造函数,根据这些引用,拷贝构造函数是一个转换构造函数,所以我认为是
-
@NicolBolas ??? 复制构造函数 do 执行派生到基的转换。上面的代码调用复制构造函数
Base(Base const&)从d初始化b。 -
@jackX:派生到基的转换发生在初始化传递给复制构造函数的参数期间。调用复制构造函数的行为本身并不是一种转换。
-
@NicolBolas "没有这样的标准转换;这种从派生到基的转换只存在于隐式转换序列的描述中" [[over.best.ics]/6](timsong-cpp.github.io/cppwp/n4659/… ),[[over.ics.ref]/1](timsong-cpp.github.io/cppwp/n4659/…),我认为从参数
d到参数Base const&,如你所说,是一个derived-to-base conversions,但提到Base::Base(Base const&)的创新在标准中,它本身就是一个复制构造
标签: c++ language-lawyer