[cfe-dev] libc++, std::bind, and <random>

Steven Watanabe watanabesj at gmail.com
Mon Apr 11 09:22:17 PDT 2011


AMDG

On 04/11/2011 08:38 AM, Howard Hinnant wrote:
>
> On Apr 11, 2011, at 11:30 AM, Steven Watanabe wrote:
>
>> When calling the copy constructor of a Random
>> Number Engine with a non-const argument, the library is
>> incorrectly treating the argument as a SeedSeq.
>> The two declarations in question are:
>>
>> mersenne_twister(const mersenne_twister&);
>> template<typename SeedSeq>  mersenne_twister(SeedSeq&);
>
> Thanks Steven.  I'm working on an improved constraint
> for the SeedSeq template parameter.  The current
> constraint is simply that it is not implicitly
> convertible to the engine's result_type.
>

I think that constraint is wrong.  (I don't have
the final draft, so my information could be
out of date, however. I'm referencing n3242)

Here are the relevant sections:
a) T is the type named by E's associated result_type;
c) s is a value of T;
d) q is an lvalue satisfying the requirements of
    a seed sequence (26.5.1.2);

Table 117 -- Random number engine requirements
E(s) -- Creates an engine with initial state determined by s.
E(q) -- Creates an engine with an initial state that
         depends on a sequence produced by one call
         to q.generate.

Now consider the following class:

class my_seed_seq
{
public:
     ...all members required for a seed sequence...
     operator bool() const;
};

According to the above,

   my_seed_seq q;
   std::mt19937 gen(q);

should call the seed sequence constructor.
If you use a convertible constraint, it will
be equivalent to

   std::mt19937 gen(bool(q));

In Christ,
Steven Watanabe



More information about the cfe-dev mailing list