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};
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};