Quuxplusone added inline comments.

================
Comment at: include/memory:3933
+    typedef __shared_ptr_pointer<_Yp*, default_delete<_Yp>, _AllocT > 
_CntrlBlk;
+    __cntrl_ = new _CntrlBlk(__p, default_delete<_Yp>(), _AllocT());
     __hold.release();
----------------
EricWF wrote:

> This patch seems to support constructing a shared_ptr<FuncType> without 
> providing a non-default deleter. I don't think this should work because the 
> default deleter will attempt to free a function pointer, which is never 
> valid. (Although I think this case will still cause a compile error).

Good point. But then are you suggesting that this constructor should be SFINAEd 
in that case, or just static_assert, or leave the existing behavior (which is 
indeed a hard compile error *inside* a static-assert)?

```
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/memory:2514:27:
 error: invalid application of
      'sizeof' to a function type
            static_assert(sizeof(_Tp) > 0, "default_delete can not delete 
incomplete type");
                          ^~~~~~~~~~~
x.cc:6:2: note: in instantiation of member function 
'std::__1::default_delete<int ()>::operator()' requested here
```

(Technically-technically, arguably the user is allowed to fully specialize 
`std::default_delete<T()>` for some user-defined type `T`, right? Not that 
libc++ ought to be catering to such people.)


https://reviews.llvm.org/D30837



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to