为什么这段代码会编译?(用 g++ 和 clang++ 测试过)
以下代码用于接受函数并从中创建转发 std::function 的工厂方法。如您所见,内部的 lambda 接受const Arg&
参数并将它们转发给给定的函数。
在main()
我factory()
用来创建一个转发器 to test_func()
,它接受一个非常量引用参数。我不明白的是为什么这不会产生关于从参数中丢弃 const 限定符的错误。
请注意,确实在 中C
创建的类的实例是在main()
没有创建任何副本的情况下传递的。
#include <functional>
#include <iostream>
class C
{
public:
C() {}
C(const C&)
{
std::cout << "C copy\n";
}
};
int test_func(C& cref)
{
return 0;
}
template<typename Ret, typename... Arg>
std::function<Ret (const Arg&...)> factory(Ret (*func) (Arg...))
{
return [ func ] (const Arg&... arg) -> Ret {
return (func)(arg...);
};
}
int main() {
auto caller = factory(test_func);
C c;
caller(c);
return 0;
}