首页 > 解决方案 > 复制初始化和显式

问题描述

第一次尝试:

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++initialization

解决方案


推荐阅读