[PATCH] D48753: [libcxx] Use custom allocator's `construct` in C++03 when available.

Arthur O'Dwyer via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Jul 6 15:28:51 PDT 2018


Quuxplusone added inline comments.


================
Comment at: libcxx/include/memory:1470
+        decltype(_VSTD::declval<_Alloc>().construct(_VSTD::declval<_Pointer>(),
+                                                    _VSTD::declval<_Args>())),
+        void
----------------
vsapsai wrote:
> Quuxplusone wrote:
> > I think you should replace this `)))` with `)), void())` for absolute correctness (e.g. `construct` might plausibly return a pointer to the constructed object, and I think C++03 is okay with that).
> > Otherwise, awesome, this looks like what I'd expect. :)
> The standard says the result of `construct` is not used but I haven't found any mention it **must** be `void`.
> 
> That being said, the proposed change fails for the C++03 macro-based decltype shim:
> 
>     error: too many arguments provided to function-like macro invocation
>                                         _VSTD::declval<_Args>()), void()),
>                                                                   ^
> 
> One option to fix that is to use
> 
>     is_same
>     <
>         decltype(_as_before_),
>         decltype(_the_same_copy_pasted_argument_)
>     >
> 
> But I don't think this use case is worth such hacks.
I think the workaround is easier. Try

```
template <class _Alloc, class _Pointer, class _A0>
struct __has_construct<_Alloc, _Pointer, _A0, typename enable_if<
  is_same<
    decltype((_VSTD::declval<_Alloc>().construct(
      _VSTD::declval<_Pointer>(),
      _VSTD::declval<_A0>()
    ), void() )),
    void
  >::value
>::type> : std::true_type {};
```

i.e. with an extra set of parens to group the argument to the `decltype` macro: `decltype(())` instead of `decltype()`. I also drive-by edited `Args` to `A0`, matching how it's done elsewhere in pseudo-variadic-templates in this file.


https://reviews.llvm.org/D48753





More information about the cfe-commits mailing list