Почему явный конструктор, ожидающий std::shared_ptr, принимает nullptr?

Следующий код отлично компилируется с gcc 4.8.1

#include <memory>

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

     }
};

int main() {
    Foo foo(nullptr);
}

Почему это возможно? Разве явное не должно препятствовать неявному вызову компилятором std::shared_ptr(nullptr)?


person hllnll    schedule 02.04.2014    source источник
comment
В качестве примечания: универсальный или иной template конструктор может использовать SFINAE, чтобы делать то, что вы хотите.   -  person Yakk - Adam Nevraumont    schedule 03.04.2014


Ответы (1)


Разве явное не должно препятствовать неявному вызову компилятором std::shared_ptr(nullptr)?

Нет, явный конструктор предотвратит это:

Foo foo = some_shared_ptr;

Это не влияет на конструкторы shared_ptr, поэтому неявное преобразование из nullptr в shared_ptr по-прежнему разрешено.

person juanchopanza    schedule 02.04.2014