Почему не `const int ci = 2; std :: forward (ci); `работа и как ее исправить / обойти?

Простой вопрос, почему не работает следующее (подразумевается копия ci )?

#include 

int main(){
  const int ci = 2;
  std::forward(ci);
}

prog.cpp: В функции 'int main ()':
prog.cpp: 6: 23: error: нет соответствия функция для вызова 'forward (const int &)'

Проблема проявилась при написании некоторых шаблонов, где у меня есть простой тип держателя, как показано ниже. Чтобы избежать ненужных копий, я по возможности использую идеальную пересылку, но, похоже, в этом и заключается корень проблемы.

template
struct holder{
    T value;

    holder(T&& val)
        : value(std::forward(val))
    {}
};

template
holder hold(T&& val){
    // T will be deduced as int, because literal `5` is a prvalue
    // which can be bound to `int&&`
    return holder(std::forward(val));
}

template
void foo(holder const& h)
{
    std::tuple t;  // contrived, actual function takes more parameters
    std::get<0>(t) = std::forward(h.value); // h.value is `const T`
}

int main(){
    foo(hold(5));
}

Если потребуется дополнительная информация, дайте мне знать.
Мы приветствуем любую идею обойти эту проблему.

9
задан Xeo 27 November 2011 в 04:16
поделиться