c++ - 复制构造方法的使用?
问题描述
在我的代码中,我使用内部类作为另一个类的迭代器。
为了简化情况,代码可以如下所示:
class A {
public:
class B {
public:
explicit B(void):idx(3){}
B(const B&b) {
idx = 4; // never be called
}
private:
int idx=0;
};
B getB()
{ return A::B(); }
};
void test2(){
A a;
A::B b = a.getB(); // b.idx ends with value of 3
}
问题是,在test2()
运行A::B b = a.getB();
时,复制构造方法没有被调用。并b
以 value 结尾3
。为什么是这样?
另一个问题让我很困惑
class A {
public:
class B {
public:
explicit B(void):idx(3){}
explicit B(const B&b) {} // C2440, cannot convert from "A::B" to "A::B"
private:
int idx=0;
};
B getB()
{ return A::B(); }
};
为什么C2440会出现两种完全相同的类型?
解决方案
你看到的是复制省略。为了使优化器更容易加速生成的代码,C++ 标准允许在某些情况下跳过复制构造函数。
推荐阅读
- c# - 如何在 .NET Core 3.1 中使用全局异常自定义过滤器显示错误模式?
- dart - Dart - 格式化字符串日期到日期时间
- python - Pandas Dataframe 从行的“集群”中检测和检索数据
- javascript - 使用 Create-React-App 创建 React 应用程序失败并出现 ERR!在'...er":"^2.0.0","eslint"' 附近解析时 JSON 输入意外结束
- python - 字符串替换不删除子字符串
- python - Xlsxwriter 自定义列格式问题
- amazon-s3 - parquet 如何在 S3 中存储时间戳数据?
- node.js - Firebase CLI 意外令牌
- python - 在 Microsoft Azure 上部署 Flask WebApp
- css - 如何在容器(CSS)中对齐?