我有以下代码:
template<typename T>
class Dispatcher
{
public:
void operator()(T&& v) {}
};
struct S
{
Dispatcher<S*> dispatcher;
void test()
{
dispatcher(this);
}
};
它仅在 VisualStudio 中给出了错误error C2664: 'void Dispatcher<S *>::operator ()(T &&)' : cannot convert argument 1 from 'S *const ' to 'S *&&'
。在 gcc 和 clang 中,它可以正常工作。
我搜索了文档,我发现here的唯一内容是:When used according to the following recipe in a function template, forwards the argument to another function with the value category it had when passed to the calling function.
这是否意味着完美转发可以保证仅适用于功能? gcc 和 clang 不符合标准吗?