Следующий код компилируется с 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)?
Должно ли явное запрещение компилятору вызывать не std :: shared_ptr (nullptr)?
Нет, явный конструктор остановил бы это:
Foo foo = some_shared_ptr;
Он не влияет на конструкторы shared_ptr
, поэтому неявное преобразование из nullptr
в shared_ptr
все еще разрешено.
template
может использовать SFINAE, чтобы делать то, что вы хотите.