第一次尝试:
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)呢? 我在this post中看到情况(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