make_shared忽略显式说明符吗?



考虑以下示例:

#include <iostream>
#include <memory>
struct A
{
explicit A(int x) 
{ 
std::cout << x << std::endl;
}
};
void Foo(A ) {}
std::shared_ptr<A> Foo2(int x)
{
// why does this work?
return std::make_shared<A>(x);
}
int main()
{
A a(0);
Foo(a);
// Foo(1); does not compile
Foo2(2);
}

我有一个带有显式标记构造函数的class A,因此它不会隐式地从int转换为class A。但是在对std::make_shared的调用中,我可以通过只传递int来调用和创建这个类。为什么这是可能的,我做这件事的方式有什么问题吗?

这是预期的行为,因为std::make_shared执行直接初始化,它也考虑显式构造函数。

对象是由表达式::new (pv) T(std::forward<Args>(args)...)

构造的。

直接初始化比复制初始化更宽松:复制初始化只考虑非显式构造函数和非显式用户定义转换函数,而直接初始化考虑所有构造函数和所有用户定义转换函数。

Foo(1);不能工作,因为形参被复制初始化,这将不考虑显式构造函数。

相关内容

  • 没有找到相关文章

最新更新