c++ - 类初始化器列表不适用于复制构造函数
问题描述
我有一个带有一个变量的 A 类,如果不存在复制构造函数,则使用初始化列表初始化变量完全可以。
class A {
public:
int x;
};
int main()
{
A a = {2};
printf("Hello World");
return 0;
}
但是,如果我在类中确实有一个复制构造函数,我会收到一个错误
main.cpp:23:13: error: could not convert ‘{2}’ from ‘’ to ‘A’
A a = {2};
代码 :
class A {
public:
int x;
A(A& v)
{
printf("Copied");
}
};
int main()
{
A a = {2};
printf("Hello World");
return 0;
}
为什么会这样?
解决方案
用户声明的构造函数不是聚合,那么它就不能再从大括号初始化列表A::A(A&)
中聚合初始化。A
{2}
您可以添加一个构造函数int
,例如
class A {
public:
int x;
A(int x) : x(x) {}
A(const A& v)
{
printf("Copied");
}
};
然后
A a = {2}; // list-initialize a from {2} by constructor A::A(int)
顺便说一句:复制构造函数const T&
通常采用。
推荐阅读
- mysql - 如何按值获取分组列计数
- heap-memory - 带有python的Nifi ExecuteScript:OOM异常
- c - 结构填充和性能损失
- node.js - Postgres sql脚本在nodejs中管理数据库
- c# - 在单独的类库中使用实体框架核心 dbcontext 的脚手架 asp.net razor 页面出现问题
- angular - 单元测试中的错误(业力)。没有将“exportAs”设置为“ngbPopover”的指令
- javascript - Adobe Campaign Classic - 类型规则问题
- android - AndroidX Crypto库,加密后无法保存文件
- angular - 从 angular7 更新后,angular8 应用程序无法在 IE11 中运行
- r - 使用 dplyr 在每个组中循环以创建逐步曲线