c++ - 为什么我可以将采用按值参数的函数绑定(bind)到采用左值引用的 std::function?

标签 c++ c++11

在挖掘错误的来源之后,我惊讶地发现以下似乎是合法的 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 是用 f1f2 构造。

关于c++ - 为什么我可以将采用按值参数的函数绑定(bind)到采用左值引用的 std::function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42774163/

相关文章:

c++ - 强制数组衰减(因为没有更好的标题)

c++ - 为什么我对以下函数的调用不明确?

c++11 - 来自 ubuntu 16.04 repo 的 c++ 库 - 编译器选项

c++ - 确定 minimax tic-tac-toe 中的正确位置

c++ - 使用 Eclipse 从 OpenCV-3.1 读取错误

c++ - 卡在 _dl_sysinfo_int80 上的多线程应用程序

c++ - 如何从可变元组中获取元素?

c++ - 为什么 C++ 编译器找不到运算符 <<

c++ - 前向声明未按预期工作

C++ 前向声明 using 指令