相关疑难解决方法(0)

std :: function的模板参数(签名)是不是它的类型?

鉴于以下代码,模糊性背后的原因是什么?我可以绕过它还是我必须保持(讨厌的)显式演员?

#include <functional>

using namespace std;

int a(const function<int ()>& f)
{
    return f();
}

int a(const function<int (int)>& f)
{
    return f(0);
}

int x() { return 22; }

int y(int) { return 44; }

int main()
{
    a(x);  // Call is ambiguous.
    a(y);  // Call is ambiguous.

    a((function<int ()>)x);    // Works.
    a((function<int (int)>)y); // Works.

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有趣的是,如果我a()function<int ()>参数注释掉函数并a(x)在我的main中调用,则编译正确失败,因为它们之间的类型不匹配xfunction<int (int)>唯一a()可用函数的参数.如果编译器在这种情况下失败,为什么在存在这两个a()函数时会有任何歧义?

我试过VS2010和g ++ v.4.5.两者都给我完全相同的歧义.

c++ c++11 std-function

39
推荐指数
2
解决办法
5696
查看次数

为什么operator()在C++ 17中为std :: function改变?

以下代码在C++ 14中被认为是非法的,但在C++ 17中是合法的:

#include <functional>

int main()
{
    int x = 1729;
    std::function<void (int&)> f(
        [](int& r) { return ++r; });
    f(x);
}
Run Code Online (Sandbox Code Playgroud)

不要费心去测试它,你会得到不一致的结果,因此很难说它是一个bug还是故意的行为.但是,比较两个草稿(N4140和N4527,两者都可以在github.com/cplusplus/draft上找到),[func.wrap.func.inv]有一个显着的区别.第2段:

返回:如果R为空则无效,否则返回值为INVOKE(f,std :: forward(args)...,R).

在草稿之间删除了上述内容.这意味着lambda的返回值现在被静默丢弃.这似乎是一种错误.任何人都可以解释这个推理吗?

c++ c++14 c++17

26
推荐指数
1
解决办法
964
查看次数

lambdas的参数和返回值的类型转换规则是什么?

我最近惊讶于lambdas可以被分配给std::function具有略微不同签名的s .略有不同意味着当function指定返回时void,lambda的返回值可能会被忽略,或者参数可能是functionlambda 中的值但是引用.

请参阅此示例(ideone),其中我强调了我怀疑不兼容的内容.我认为返回值不是问题,因为你总是可以调用一个函数并忽略返回值,但是从引用到值的转换看起来很奇怪:

int main() {
    function<void(const int& i)> f;
    //       ^^^^ ^^^^^    ^
    f = [](int i) -> int { cout<<i<<endl; return i; };
    //     ^^^    ^^^^^^
    f(2);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

小问题是:为什么这段代码编译和工作?主要问题是:与lambda参数和返回值一起使用时,类型转换的一般规则是什么std::function

c++ lambda type-conversion c++11

21
推荐指数
1
解决办法
804
查看次数

使用`std :: function <void(...)>`来调用非void函数

前一段时间我用std::function的很像:

std::function<void(int)> func = [](int i) -> int { return i; };
Run Code Online (Sandbox Code Playgroud)

基本上,我这样做是因为我想在a中存储不同的函数对象std::function,但我不想限制这些函数的返回类型.由于这似乎有效,我接受了它.但我不相信它是安全的,我也无法找到任何文件.有谁知道这种用法是否合法?或者更一般地说,对象的规则是什么,可以安全地分配给std::function

编辑

为了澄清,我关心的问题是lambda函数返回一个int,而func声明返回类型void.我不确定这是否正常,特别是一旦打电话func().

c++ return-type c++11 std-function

19
推荐指数
1
解决办法
6574
查看次数

std :: function赋值应该忽略返回类型吗?

根据C++ 11或C++ 14标准,代码是否在有效的C++下面?

#include <functional>

int ReturnInt()
{
  return 5;
}

int main( int argc, char **argv )
{
  std::function< void () > BoundType = ReturnInt;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

该代码可以使用最新的gg(4.8.3)和clang(4.3.2)的cygwin版本编译,但不适用于Visual Studio 2013,Visual Studio 2013年11月的CTP或Visual Studio 14预览版.如果将std :: function更改为boost :: function,它也会在所有平台上编译.

我发现这个其他堆栈溢出问题表明它应该工作.

c++ c++11 std-function c++14

6
推荐指数
1
解决办法
1143
查看次数

为什么不起作用阻止不同返回类型的施工?

std::function 允许你这样做:

std::function<void()> = []()->int{return 42;};
Run Code Online (Sandbox Code Playgroud)

但不是这个:

std::function<void()> = [](int i)->int{return 42;};
Run Code Online (Sandbox Code Playgroud)

大概是因为返回类型不是函数签名的一部分.但是std::function是一个类类型,它被赋予一个返回类型,并且知道它构造的函数对象的返回类型.所以这里可能存在编译器错误.

为什么没有编译器错误?

c++

5
推荐指数
1
解决办法
93
查看次数

标签 统计

c++ ×6

c++11 ×4

std-function ×3

c++14 ×2

c++17 ×1

lambda ×1

return-type ×1

type-conversion ×1