在挖掘错误的来源之后,我惊讶地发现以下似乎是合法的 C++11(使用 GCC/clang 和 Wall 编译得很好)。特别是,为什么我可以将 f1
分配给一个 RefFunction
,它按值获取参数?
我尝试用谷歌搜索来寻找解释,但没有找到任何相关内容,可能是因为我不知道究竟要用谷歌搜索什么。如果有人可以指导我了解为什么这是合法的,我将不胜感激。
#include <iostream>
using namespace std;
void f1(int val) {
val = 1;
}
void f2(int& val) {
val = 2;
}
using RefFunction = std::function<void(int&)>;
int main()
{
using namespace std::placeholders;
int val = 42;
// I was expecting a compile error here telling me that f1 doesn't
// have the right signature (int instead of int&)
RefFunction f = f1;
f(val);
cout << val << endl; // prints 42
// This makes sense, f2 takes argument by reference
f = f2;
f(val);
cout << val << endl; // prints 2
return EXIT_SUCCESS;
}
最佳答案
暂时抛开标准,考虑以下方面:
void f1(int val) {
val = 1;
}
void f2(int& val) {
val = 2;
}
void WrapperFunction(int& val)
{
f1(val); // Should be OK
f2(val); // Should be OK.
}
编译器对上面的代码应该没有任何问题。如果您认为 WrapperFunction
类似于 std::function
,那么无论 std::function
是用 f1
或 f2
构造。
关于c++ - 为什么我可以将采用按值参数的函数绑定(bind)到采用左值引用的 std::function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42774163/