У меня есть шаблон функции, где я хочу сделать идеальную пересылку в лямбду, которую я запускаю в другом потоке. Вот минимальный тестовый пример, который вы можете напрямую компилировать:
#include <thread>
#include <future>
#include <utility>
#include <iostream>
#include <vector>
/**
 * Function template that does perfect forwarding to a lambda inside an
 * async call (or at least tries to). I want both instantiations of the
 * function to work (one for lvalue references T&, and rvalue reference T&&).
 * However, I cannot get the code to compile when calling it with an lvalue.
 * See main() below.
 */
template <typename T>
std::string accessValueAsync(T&& obj)
{
    std::future<std::string> fut =
        std::async(std::launch::async,
            [](T&& vec) mutable
            {
                return vec[0];
            },
            std::forward<T>(obj));
    return fut.get();
}
int main(int argc, char const *argv[])
{
    std::vector<std::string> lvalue{"Testing"};
    // calling with what I assume is an lvalue reference does NOT compile
    std::cout << accessValueAsync(lvalue) << std::endl;
    // calling with rvalue reference compiles
    std::cout << accessValueAsync(std::move(lvalue)) << std::endl;
    // I want both to compile.
    return 0;
}
Для случая, не являющегося компилятором, вот последняя строка сообщения об ошибке, которая понятна:
main.cpp|13 col 29| note:   no known conversion for argument 1 from ‘std::vector<std::basic_string<char> > to ‘std::vector<std::basic_string<char> >&
 У меня есть чувство, что это может иметь какое-то отношение к тому, как выводится T&&, но я не могу точно определить точную точку отказа и исправить ее. Какие-либо предложения?
Спасибо!
EDIT: Я использую gcc 4.7.0 на всякий случай, если это может быть проблемой компилятора (возможно, нет)
