Копирование генераторов псевдослучайных чисел означает, что вы получите один и тот же поток «случайных» чисел от каждого, что нежелательно, поэтому вам нужна ссылка там.
Однако, вы могли быпросто скажите randgen&
.
Согласно [dcl.ref]
в черновике 3225, просто randgen&
создаст ссылку lvalue независимо от того, что передано (type, lvalue-reference-type или rvalue-ссылочный тип), поэтому я бы просто использовал это.
Цитата из стандарта, который управляет этим поведением:
Если typedef (7.1.3), тип шаблон-параметр (14.3.1) или decltype-specier (7.1.6.2) обозначает тип TR
, который являетсяссылка на тип T
, попытка создать тип «lvalue ссылка на cv TR
» создает тип «lvalue ссылка на * 1032»*T
», при попытке создать тип« rvalue ссылка на cv TR
»создается тип TR
.
[Пример:
int i;
typedef int& LRI;
typedef int&& RRI;
LRI& r1 = i; // r1 has the type int&
const LRI& r2 = i; // r2 has the type int&
const LRI&& r3 = i; // r3 has the type int&
RRI& r4 = i; // r4 has the type int&
RRI&& r5 = i; // r5 has the type int&&
decltype(r2)& r6 = i; // r6 has the type int&
decltype(r2)&& r7 = i; // r7 has the type int&
- конец примера]
Из раздела [meta.trans.ref]
:
template <class T> struct add_lvalue_reference;
Если T
называет объект или тип функции, тогда член typedef type
должен назвать T&
;в противном случае, если T
называет тип «rvalue ссылка на T1
», тогда член typedef type
должен назвать T1&
;в противном случае type должен называть T
.
Это одно и то же.
В C ++ 03 они тоже одно и то же,С [type.arg.type]
:
Если аргумент шаблона для параметра шаблона T
называет тип «ссылкой на cv1 S
», попытка создать тип« ссылка на cv2 T
»создает тип« ссылка на cv12 S
”, где cv12 - объединение cv-квалификаторов cv1 и cv2 .Резервные cv-квалификаторы игнорируются.
[Пример:
template < class T > class X {
void f( const T &);
/ ∗ . . . ∗ /
};
X< int & > x; / / X<int&>::f has the parameter type const int&
- конец примера]