2014-11-09 3 views
1

сказать, что я эту структуру:идеальный экспедиторская дилемма

template <typename ...A> 
struct A 
{ 
    void f(A&& ...args) 
    { 
    fwd(std::forward<A>(args)...); 
    } 

    template <typename ...B> 
    void g(B&& ...args) 
    { 
    fwd(std::forward<B>(args)...); 
    } 
}; 

воли f и g как вперед отлично, если A... == B...? ИМО, они должны, но я просто прошу быть уверенным.

EDIT: Причина этого вопроса - общая лекция о том, как идеальные функции пересылки всегда должны быть функциями шаблона. Очевидно, это не так для f.

+1

Зависит от того, что вы имеете в виду * будут ли они как вперед, так прекрасно *. 'f()' принимает только ссылки rvalue в качестве аргументов и передает их вместе как rvalues ​​в 'fwd()'. 'g()' принимает как значения lvalue, так и rvalue, и будет пересылать их вместе, сохраняя соответствующие категории значений. – Praetorian

+3

@Praetorian: Почему только rvalue-ссылки? Мы не знаем, какой экземпляр «A» использовался. Например, 'A ' 'A ' 'Aint const &>' 'A ' ... – Deduplicator

+0

Что вы говорите, происходит из-за правил дедукции, что, если вы создаете экземпляр явно? То есть вы можете создать экземпляр 'A' с параметрами (-ами) ссылочного типа. – user1095108

ответ

2

Будет f и g как вперед, так прекрасно, если A... == B...?

Да. Я не вижу причин, по которым они не должны.

+0

Как вы можете видеть в комментариях выше, иногда возникает некоторая путаница. – user1095108

1

Да, если A... == B..., нет никакой разницы в поведении. Однако причиной общих советов о функциях пересылки, подлежащих шаблонизации, является то, что вы предпочли бы, чтобы компилятор выводил типы (как в случае шаблона функции) вместо того, чтобы указывать правильные типы (как в случае шаблона класса). Это различие иллюстрируется следующим фрагментом для типа X (конечно, они не удовлетворяют A... == B...):

X x; 
A<X>::f(X()); 
A<X>::g(X());//here, f and g have the same behaviour 

A<X>::f(x);//fails to compile, since A<X>::f expects an rvalue ref. 
A<X>::g(x);//works as expected - Here, B... = X&, while A... = X. 

A<const X&>::f(X());//oh noes! fwd gets a const X&. 
A<const X&>::g(X());//forwards correctly as B... = X, even though A... = const X&. 
Смежные вопросы