c++中带有隐式转换的复制初始化
Copy-initialization with implicit conversion in c++
class Foo {
public:
Foo(float b) {}
};
class Bar {
public:
Bar(Foo foo) {}
};
int main(int argc, char *argv[]) {
Bar b1(3.0f); // accept, one implicit convertion happens there.
Bar b2 = 3.0f; // error: no viable conversion from 'float' to 'Bar'
return 0;
}
为什么第二个表达式编译失败?我期望它调用与第一个表达式相同的转换构造函数。
From [dcl.init]:
否则(即,对于剩余的复制初始化情况),用户定义的转换序列可以将从源类型转换为目标类型,或者(当为转换函数时)使用)来枚举派生类,如13.3.1.4所述,最好的是通过重载解析(13.3)选择。
可以调用用户定义的从源类型直接到目标类型的转换。也就是说,如果我们有Bar(float )
,我们会考虑这个构造函数。然而,在这种情况下,我们的候选者只是Bar(Foo )
,它不需要float
。
允许0个或一个用户定义的转换。在直接初始化的情况下,我们只需调用Bar(Foo )
,它调用一个用户定义的转换(float --> Foo
)。在复制初始化的情况下,我们正在寻找从float
(源类型)一直到Bar
(目标类型)的转换序列,这将涉及两个用户定义的转换(float --> Foo
, Foo --> Bar
),因此出现错误。
第二种类型的初始化称为复制初始化,使用复制构造函数。因此,这种类型的初始化期望右侧可转换为Bar。
相关文章:
- 复制列表初始化的隐式转换的等级是多少
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 复制构造函数隐式转换问题
- 将文件复制到自定义位置,存在字符串转换问题
- 在 Cython 中将C++向量转换为 numpy 数组,而无需复制
- 有没有办法复制派生类指针的向量而不将其强制转换为基类?
- 复制交换习惯用法-我们可以在这里使用动态强制转换操作吗
- 为什么转换运算符调用复制构造函数两次,而等效函数只调用它一次
- 在不复制数据的情况下,将double数组转换为只有double成员的structs数组
- r-在Rcpp和C++之间转换矢量(使用Rcpp::as或Rcpp:::wrap)是否会创建一个新的矢量并复制元素
- 如何在不复制数据的情况下将 cv::Mat 转换为 2d 标准::矢量
- 为什么在使用转换构造函数编译代码时需要 const 复制构造函数?
- 复制初始化 - 从 'int' 类型转换为非标量类型
- 标准::列表转换和复制
- 我的lambda在复制构建期间没有正确转换捕获的"this"
- 如何在不复制数据的情况下在平面数组和多维数组之间进行转换?
- 从隐式强制转换复制shared_ptr有什么问题?
- 从指针进行特征3类型的强制转换/复制(溢出uint8_t)
- 通过用户定义的转换复制类类型的初始化
- 是一个函数,用于转换复制返回值的对象