c++ - 复制初始化和显式
问题描述
第一次尝试:
class Local {
public:
Local() {std::cout << "default\n"; }
Local(const Local&) {std::cout << "copy ctor!\n"; }
};
int main() {
// Direct list init -> Value init -> Default init
Local obj{};
// Copy initialization -> non-explicit copy ctor
Local obj_one = obj;
// Temporary value init -> Copy initialization -> non-explicit copy ctor
Local obj_two = Local{};
return 0;
}
第二次尝试(添加explicit
):
class Local {
public:
Local() {std::cout << "default\n"; }
// now here explicit
explicit Local(const Local&) {std::cout << "copy ctor!\n"; }
};
int main() {
Local obj{};
// (1) Error, copy-initialization does not consider explicit constructor
Local obj_one = obj;
// (2) Why there is no error?
Local obj_two = Local{};
return 0;
}
万一(1)一切都很好。但是情况(2)呢?我在这篇文章中读到,在情况(2)中:
值初始化一个临时值,然后将该值复制到 c2(读取 5.2.3/2 和 8.6/14)。这当然需要一个非显式的复制构造函数(阅读 8.6/14 和 12.3.1/3 和 13.3.1.3/1 )。
clang++ -std=c++17 main.cpp
解决方案
推荐阅读
- c - 如何在 fgets() 函数中超出定义的字符进行读写
- python - django自定义动作名称根据模型名称更改
- selenium - python selenium/soup 没有在linkedined中滚动和打印整个作业容器
- azure - ADF 数据流正在创建零字节文件
- routes - 从 Here maps routing api 版本 7 和版本 8 返回的路由结果不同。有人可以分享原因吗?
- css - CSS 向右对齐项目
- dynamics-crm - 在来自 Dynamics 365 的电子邮件中设置事件日期的样式
- c++ - 如何 - 比较 char 数组中的字符以确保用户没有输入数字
- javascript - 你如何在到期日使html表中的一行变灰
- c# - 罗斯林分析仪。如何将程序集与项目和程序集与 nuget 包区分开来