C++ 为什么需要std::shared\u ptr的显式构造函数接受null ptr?

C++ 为什么需要std::shared\u ptr的显式构造函数接受null ptr?,c++,c++11,explicit,C++,C++11,Explicit,下面的代码可以使用GCC4.8.1进行良好编译 #include <memory> class Foo { public: explicit Foo(const std::shared_ptr<Foo>& foo) { } }; int main() { Foo foo(nullptr); } #包括 福班{ 公众: 显式Foo(const std::shared_ptr&Foo){ } }; int main(){ 富富(nu

下面的代码可以使用GCC4.8.1进行良好编译

#include <memory>

class Foo {
public:
     explicit Foo(const std::shared_ptr<Foo>& foo) {

     }
};

int main() {
    Foo foo(nullptr);
}
#包括
福班{
公众:
显式Foo(const std::shared_ptr&Foo){
}
};
int main(){
富富(nullptr);;
}
为什么这是可能的?显式函数不应该阻止编译器隐式调用std::shared_ptr(nullptr)吗

显式函数不应该阻止编译器隐式调用std::shared_ptr(nullptr)吗

否,显式构造函数将阻止这种情况发生:

Foo foo = some_shared_ptr;
它对
shared_ptr
的构造函数没有影响,因此仍然允许从
nullptr
隐式转换为
shared_ptr

显式函数不应该阻止编译器隐式调用std::shared_ptr(nullptr)吗

否,显式构造函数将阻止这种情况发生:

Foo foo = some_shared_ptr;

它对
shared\u ptr
的构造函数没有影响,因此仍然允许从
nullptr
隐式转换到
shared\u ptr

作为注释,通用或其他
模板
构造函数可以使用SFINAE执行您想要的操作。作为注释,通用或其他
模板
构造函数可以使用SFINAE来完成您想要的任务。