请参见下面的实时示例:https://onlinegdb.com/Hkg6iQ3ZNI
#include <iostream>
#include <utility>
#include <type_traits>
class A
{
public:
A(int v=-10):v_(v){}
void print()
{
std::cout << "called A: " << v_ << std::endl;
}
private:
int v_;
};
void f(int v)
{
std::cout << "called f: " << v << std::endl;
}
template<typename T,typename ... Args>
void run(A&& a,
T&& t,
Args&& ... args)
{
a.print();
t(std::forward<Args>(args)...);
}
template<typename T,typename ... Args>
void run(T&& t,
Args&& ... args)
{
run(A(),
std::forward<T>(t),
std::forward<Args>(args)...);
}
int main()
{
int v_function=1;
int v_a = 2;
run(f,v_function);
return 0;
}
上面的代码编译,运行和打印(按预期方式:]
称为A:-10
称为f:1
但是如果将主要功能修改为:
int main()
{
int v_function=1;
int v_a = 2;
run(f,v_function);
// !! added lines !!
A a(v_a);
run(a,f,v_function);
return 0;
}
然后编译失败,并显示错误:
main.cpp:30:6:错误:与对‘(A)(void(&)(int),int&)’的调用不匹配]
t(std :: forward(args)...);
〜^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
这似乎表明,即使将A的实例作为第一个参数传递,重载函数也是如此
void(*)(T&&,Args&&...)
被称为,而不是
void(*)(A&&,T&&,Args&&...)
带