c++中赋值构造函数和其他构造函数的区别

Differences between assignment constructor and others in c++

std::shared_ptr<Res> ptr=new Res();

以上说法不成立。 编译器抱怨没有可行的转换.... 而下面的作品

std::shared_ptr<Res> ptr{new Res()} ;

解释一下这怎么可能?!

实际上,构造函数{统一、括号、赋值}的主要区别是什么?

因为在本例中,您使用的是 C++ 复制初始化。

为了使其正常工作,Res 类型需要一个适当的 复制构造函数 non-explicit 构造函数。

在 C++ 中,使用复制初始化时不考虑显式构造函数。

此页面有助于审核: https://en.cppreference.com/w/cpp/language/copy_initialization

std::shared_ptr的构造函数采用原始指针,标记为explicit;这就是 = 不允许您调用此构造函数的原因。

使用 std::shared_ptr<Res> ptr{new Res()}; 语法允许您调用显式构造函数来初始化变量。

std::shared_ptr<Res> ptr=new Res();

将调用隐式构造函数,将指向 Res 的指针作为单个参数,而不是显式参数。

这是一个使用自定义 class 的简化示例,没有赋值运算符,只有一个构造函数:

class Test
{
public:
    Test(int i) { }

    // mark all automatically generated constructors and assignment operators as deleted
    Test(Test&&) = delete;
    Test& operator=(Test&&) = delete;
};

int main()
{
    Test t = 1;
}

现在将构造函数更改为

explicit Test(int i) { }

main函数将不再编译;以下替代方案仍然可行:

Test t(1);
Test t2{1};