[PATCH] Implement std::experimental::sample

Eric Fiselier eric at efcs.ca
Fri Apr 24 10:37:02 PDT 2015


In http://reviews.llvm.org/D9044#161265, @eugenis wrote:

> In http://reviews.llvm.org/D9044#161258, @EricWF wrote:
>
> > In http://reviews.llvm.org/D9044#156827, @eugenis wrote:
> >
> > > In http://reviews.llvm.org/D9044#156813, @EricWF wrote:
> > >
> > > > You'll need to use reserved identifiers
> > >
> > >
> > > Do you mean for local variable names? Is there a technical reason for this, or just a code style thing?
> >
> >
> > For any name not defined in the standard you should use reserved identifiers. Assume that the user of the standard library defines every non-reserved, non-defined name as a macro. We use reserved identifiers so that conforming programs can define non-reserved names globally and still use the standard library.
> >
> > For example:
> >
> >   #define PopulationIterator char*
> >   #define SampleIterator char*
> >   #define UniformRandomNumberGenerator &rand
> >   #include <experimental/algorithm>
> >
>
>
> Good point, will do.
>
> > 
>
> > 
>
> > > > and guard the definition of `sample` inside a C++14 only block because adding a new definition of could break existing code.
>
> > 
>
> > > 
>
> > 
>
> > > 
>
> > 
>
> > > n4335 does not seem to require that this is only available in C++14. And aren't names under std:: already reserved, and an addition of a new std:: name could not break compliant code?
>
> > 
>
> > 
>
> > I would prefer not to restrict these things to c++14 only, although there may be a reason that conforming implementations need to that isn't visible in n4335.
>
> > 
>
> > However because `sample` is a function it can be looked up by ADL. Since `sample` takes user-defined iterator types and RNG's it is possible that existing unqualified calls to `sample` in user code may now find `std::sample`.
>
>
> That's a valid concern, but limiting this definition to C++14 will still break existing C++14 code. Is it really that much better than breaking C++11 and C++14 at the same time?
>  Also, that would be std::experimental::sample.


This is probably a conversation worth having on a larger scale. I think the rational for keeping in C++14 only is:

1. N4335 references the C++14 standard as its base document
2. C++11 should be "stable". Additions added to the language after C++11 not break valid code.

However I think these new features are useful enough that there is a strong motivation to provide them whenever possible. Also, in order for this to break existing code the user has to be including <experimental/*> headers anyway. Furthermore I believe we already allow `string_view` to be used in C++11.

I'll open up a bug to discuss this issue.


REPOSITORY
  rL LLVM

http://reviews.llvm.org/D9044

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/






More information about the cfe-commits mailing list