0

次のテンプレート メンバー関数を記述しましたが、コンパイラによってエラーが発生せずに呼び出すことはできません。

template <class T, class A>
auto tpool::enqueue(T&& func, std::vector<A>&& args)
-> std::vector<std::future<decltype(std::forward<T>(func)(decltype(std::forward<A(args))::value_type))>>
{
    //...
}

tpool tp();
auto f = [] (int) { /* ... */ };
std::vector<int> args; 

tp.enqueue(f, args);

clang で次のエラーが発生します。

test_cpp.cpp:144:5: error: no matching member function for call to 'enqueue'
    tp.enqueue(f, args);

test_cpp.cpp:107:13: note: candidate template ignored: substitution failure [with T = <lambda at test_cpp.cpp:140:11> &, A = int]: no matching function for call to 'forward'
auto tpool::enqueue(T&& func, std::vector<A>&& args)
4

1 に答える 1

2
template <class T, class A>
auto tpool::enqueue(T&& func, std::vector<A>&& args)

これはargs、右辺値のみを受け入れる右辺値参照になりますが、

std::vector<int> args; 
tp.enqueue(f, args);

argsは左辺値であるため、候補は無視されます。

テンプレート置換により、それ自体が左辺値参照になるT&& func可能性があるため、左辺値をバインドできることに注意してください。しかし、は常にベクトルの右辺値参照であるため、これは不可能です。T(T&)&& == T&argsAstd::vector<...>&&


とにかくコピーまたは変更しない場合は、args代わりに const 参照を渡すことができます。

template <class T, class A>
auto tpool::enqueue(T&& func, const std::vector<A>& args)

argsがベクトルでなければならないことを指定しないことで、完全転送を許可することもできます。

template <class T, class V>
auto tpool::enqueue(T&& func, V&& args)
    -> std::vector<std::future<decltype(func(args.front()))>>
于 2013-05-17T20:39:34.923 に答える