std :: bind的返回类型隐式转换为两个不同的显式构造函数

史蒂夫·洛里默(Steve Lorimer)

给定两个explicit构造函数重载(基于不同std::function<...>类型),的返回值std::bind可以选择其中一个(从而使调用变得模棱两可)

call of overloaded ‘Bar(std::_Bind_helper<false, void (Foo::*)(int), 
    Foo*, int>::type)’ is ambiguous

如果我将其中之一注释掉,则代码将编译!

我本以为使构造函数explicit要么选择正确的重载,要么阻止两者都被选中?

当然,在我绑定的点显式创建一个std::function是可行的:

    Bar b(std::function<void(int)>(std::bind((&Foo::process), &f, 1)));

但是,我对为什么类型推断不起作用感到困惑?

  • 如果from的返回值std::bind与两个构造函数签名均不匹配,explicit则应避免同时选择这两个事实
  • 如果from的返回值std::bind与两个构造函数签名之一匹配,则它们explicit应该导致选择正确的事实

这里到底发生了什么?

完整的工作代码如下:

#include <functional>

struct Foo
{
    void process(int) { }
};

struct Bar
{
    // comment out either of these to compile
    explicit Bar(std::function<void(int)>) {} 
    explicit Bar(std::function<void(short)>) {}
};

int main()
{
    Foo f;
    Bar b(std::bind(&Foo::process, &f, 1));
    return 0;
}
迪特玛·库尔(DietmarKühl)

使构造函数explicit与必须完全匹配的参数无关!使构造函数显式的影响意味着不会Bar使用该构造函数将其隐式转换为其他类型的对象但是,如果尝试Bar使用直接初始化(即Bar(x)来初始化对象,则将同时考虑这两个构造函数。

的结果std::bind()肯定不是a std::function<Signature>,即它与您的任何一个构造函数都不完全匹配。由于存在一个适用于函数对象的非explicit构造std::function<Signature>函数,因此两个签名都匹配:生成的绑定表达式不需要任何参数,但可以带参数,即,任何参数类型也不能用来区分两者中的哪一个的构造函数Bar应该匹配。即使bind表达式需要一个参数,我也不认为它将比一个构造函数更喜欢一个构造函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

显式复制构造函数和std :: sort

std :: shared_ptr <T>:指向T的右值指针的隐式构造函数

为什么在调用成员函数时std :: reference_wrapper没有隐式转换为引用?

显式构造函数和std :: initializer_list初始化

使用`std :: string`的显式构造函数获取`char *`并且工作正常

std :: tie是否允许隐式转换?

可以将[std :: streampos]隐式转换为[size_t]吗?

std :: map默认构造函数是否显式?

隐式转换为std :: vector

我可以避免在std :: variant中为每个结构显式编写构造函数吗?

构造std :: variant时,禁用从指针类型到bool的隐式转换的最佳方法是什么?

将std :: shared_ptr隐式转换为指针类型

当隐式调用构造函数时,std :: move的行为是什么?

为什么std :: in_place_t的构造函数默认且显式?

从std :: string对象到char *的显式转换,而无需使用任何std :: string成员函数

std :: vector范围构造函数可以调用显式转换吗?

我是否需要在构造函数中显式初始化std :: unique_ptr?

这两个查询如何返回相同的结果但使用不同的联接?(隐式查询与显式查询)

为什么clang使用libstdc ++删除包含std :: optional的类型上的显式默认构造函数?

C ++ 11 Lambda函数隐式转换为bool vs.std :: function

std :: function是否允许从引用隐式转换为返回类型的副本?

将std :: basic_ios显式转换为bool

std :: basic_string是否正式具有隐式生成的move构造函数?

在std :: bind中使用std :: bind:编译错误(隐式强制转换)

std :: function隐式类型转换

std::exeption_ptr 隐式转换为 bool

std::ref 隐式转换为引用混淆

为什么 std::function 可以隐式转换为具有更多参数的 std::function ?

不能 std::cout 隐式转换的 std::string