3303. Bad "constexpr" marker for destroy/destroy_n

Section: 20.2.2 [memory.syn] Status: C++20 Submitter: Jens Maurer Opened: 2019-10-10 Last modified: 2021-02-25

Priority: 0

View all other issues in [memory.syn].

View all issues with C++20 status.

Discussion:

This issue was submitted as editorial issue cplusplus/draft#3181 but is considered non-editorial.

P0784R7, approved in Cologne, added "constexpr" markers to the overloads of destroy and destroy_n taking an ExecutionPolicy parameter. This seems to be in error; parallel algorithms should not be marked "constexpr". (None of the parallel algorithms in <algorithm> is marked "constexpr".)

[2019-11 Marked as 'Ready' during Monday issue prioritization in Belfast]

Proposed resolution:

This wording is relative to N4830.

  1. Modify 20.2.2 [memory.syn], header <memory> synopsis, as indicated:

    namespace std {
      […]
      
      // 26.11.9 [specialized.destroy], destroy
      template<class T>
        constexpr void destroy_at(T* location);
      template<class ForwardIterator>
        constexpr void destroy(ForwardIterator first, ForwardIterator last);
      template<class ExecutionPolicy, class ForwardIterator>
        constexpr void destroy(ExecutionPolicy&& exec, // see 26.3.5 [algorithms.parallel.overloads]
                               ForwardIterator first, ForwardIterator last);
      template<class ForwardIterator, class Size>
        constexpr ForwardIterator destroy_n(ForwardIterator first, Size n);
      template<class ExecutionPolicy, class ForwardIterator, class Size>
        constexpr ForwardIterator destroy_n(ExecutionPolicy&& exec, // see 26.3.5 [algorithms.parallel.overloads]
                                            ForwardIterator first, Size n);  
      […]
    }