gpt4 book ai didi

c++ - 为什么用 std::function 重载函数需要一个中间变量

转载 作者:行者123 更新时间:2023-12-04 07:16:14 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Using newly declared variable in initialization (int x = x+1)?

(8 个回答)



Why is initialization of a new variable by itself valid? [duplicate]

(1 个回答)


18 天前关闭。



#include <functional>

bool f1(int a, int b)
{
return true;
}

int main()
{
// This compiles
std::function<bool()> f2 = std::function<bool()>(std::bind(f1, 1, 2));
std::function<bool()> f1 = f2;

// These don't compile
//std::function<bool()> f1 = std::function<bool()>(std::bind(f1, 1, 2));
//std::function<bool()> f1 = std::bind(f1, 1, 2);
//std::function<bool()> f1(std::bind(f1, 1, 2));
}
我试图重载 f1通过提供 std::function同名。然而,我遇到了这种奇怪的情况,其中一个中间变量 f2必须使用,否则无法编译。为什么会这样?
3种情况的错误信息如下
error: no matching function for call to ‘std::function<bool()>::function(std::_Bind_helper<false, std::function<bool()>&, int, int>::type)’
std::function<bool()> f1 = std::function<bool()>(std::bind(f1, 1, 2));
error: conversion from ‘std::_Bind_helper<false, std::function<bool()>&, int, int>::type’ {aka ‘std::_Bind<std::function<bool()>(int, int)>’} to non-scalar type ‘std::function<bool()>’ requested
std::function<bool()> f1 = std::bind(f1, 1, 2);
~~~~~~~~~^~~~~~~~~~
error: no matching function for call to ‘std::function<bool()>::function(std::_Bind_helper<false, std::function<bool()>&, int, int>::type)’
std::function<bool()> f1(std::bind(f1, 1, 2));
^

编辑 1
似乎即使在第一种情况下编译,由于原始 bool f1(int a, int b),它也没有像我希望的那样完成重载。不再可用。但我仍然想知道为什么编译器只针对上述某些情况进行编译。

编辑 2(关闭后)
虽然事实证明这种行为的原因实际上很愚蠢并且与 std::function 无关。 ,我将尝试通过发布我如何完成我想做的事情来增加一些可挽救的值(value):通过命名原始 f1功能
namespace
{
bool f1(int a, int b)
{
printf("blah\n");
return true;
}
}

int main()
{
// This works
//std::function<bool()> f2 = std::function<bool()>(std::bind(f1, 1, 2));
//std::function<bool()> f1 = f2;

// These work also
std::function<bool()> f1 = std::function<bool()>(std::bind(::f1, 1, 2));
//std::function<bool()> f1 = std::bind(::f1, 1, 2);
//std::function<bool()> f1(std::bind(::f1, 1, 2));
//

f1();
::f1(1,2);
}

最佳答案

变量一经声明就进入作用域。这意味着它们在其初始值设定项的范围内。
std::function<bool()> f1 = std::bind(f1, 1, 2); , f1= 的右侧指的是f1你在左边声明。
请注意,这绝不是 std::function 独有的。或任何东西。 int a = a;在句法上是完美的(尽管它的行为是未定义的)。

关于c++ - 为什么用 std::function 重载函数需要一个中间变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68737009/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com