c++ - 拷贝初始化和拷贝构造函数的关系
问题描述
#include <iostream>
class Test {
public:
Test(const int& i)
{
std::cout << "Direct" << std::endl;
}
Test(const Test& t)
{
std::cout << "Copy" << std::endl;
}
};
int main()
{
Test test = 1;
return 0;
}
该程序(用 C++11 编译)只会输出Direct
,但Test test = 1;
意味着隐式将 1 转换为 Test 然后将结果复制到test
,我希望它同时输出Direct
和Copy
,有人可以解释一下吗?
解决方案
直到 c++17,这个初始化:
Test test = 1;
Test
将从1创建一个临时int
对象,然后为test
. 在实践中,编译器会进行复制省略,而临时的将被省略。您可以通过传递标志来强制编译器不进行省略-fno-elide-constructors
,以查看两个构造函数调用。
从c++17开始,写法变了,右手边根本就没有临时的,所以没有什么可以省略的,只调用了一个构造函数。因此,即使您使用-fno-elide-constructors
,您也只会看到一个构造函数调用。
推荐阅读
- reactjs - 格式化日期momentjs
- bash - 如何在监视命令中保留嵌套命令替换
- scala - 在没有 bintray 的情况下使用 mfglabs commons-aws-sqs 和 dwhjames 库
- dns - 如何将我在 AWS 中的子域路由到 Zendesk
- php - Telegram Bot 上的翻译
- java - 无法构建 /EJB 项目
- elasticsearch - 批量请求的最佳性能刷新策略是什么?
- nginx - 如果服务使用新的相对 url `Location` 标头响应,Kubernetes Ingress Nginx 控制器不会保留`path`
- android - 我无法在已发布的 apk 中的屏幕之间导航
- linux - 使用主机 win10 从 docker 访问以太网摄像头