При работе с переменными шаблонами я столкнулся с двумя разными способами написания вызова std::forward
, но мне остается интересно узнать, что представляет собой реальная разница между двумя синтаксисами?Различия в синтаксисе в переадресации пакета параметров вариационного шаблона
template<typename... T>
void one(T&&... args)
{
foo(std::forward<T&&...>(args...));
}
template<typename... T>
void two(T&&... args)
{
foo(std::forward<T&&>(args)...);
}
По моим составителям они оба действителен синтаксис, и в большинстве случаев компилятор не жалуется. Но я нашел некоторые случаи, когда один или другой правильный, но компилятор не говорит, почему подробно.
Правильно ли это, что другой?
Служат ли они в разных целях?
Первый ошибочный и фактически не компилируется, за исключением одноэлементных пакетов. –
Это называется расширением пакета, так как это именно так. Вызов первого примера с помощью 'one (2, 2.3, 2.3f);' сделает тело функции 'foo (std: forward (2, 2.3, 2.3f)', который не будет компилироваться , –
DeiDei