为什么在直接初始化和分配中传递lambda而不在复制初始化中传递lambda时,为什么会编译呢?

支持:

为什么在声明对象的同一行中完成赋值运算符不允许使用lambda表达式?

它似乎在MSVC中工作。

测试代码:https : //godbolt.org/g/n2Tih1

class Func
{
    typedef void(*func_type)();
    func_type m_f;
public:
    Func() {}
    Func(func_type f) : m_f(f) {}
    Func operator=(func_type f) {
        m_f = f;
        return *this;
    }
};

int main()
{
    // doesn't compile in GCC and clang, it does in MSVC
    Func f1 = []() {

    };

    // compiles!
    Func f2;
    f2 = []() {

    };

    // compiles!
    Func f3([]() {

    });
}
songyuanyao :

Func f1 = []() {};副本初始化,需要两个用户定义的隐式转换来构造f1,第一个是从lambda到函数指针,第二个是从函数指针到Func一个转换序列中仅允许一个用户定义的隐式转换,因此它将失败。

(强调我的)

如果T是类类型,并且other的cv不合格版本不是T或不是从T派生的,或者T是非类类型,但是other的类型是类类型,则用户定义的转换序列可以将其他类型转换为T(如果T是类类型并且可以使用转换函数,则可以转换为从T派生的类型),然后通过重载分辨率选择最佳的。

隐式转换顺序按以下顺序组成:

1)零个或一个标准转换序列;
2)零个或一个用户定义的转换;
3)零或一标准转换序列。

对于f2 = []() {};试图调用适当的赋值运算符Func,它有一个,并且期望函数指针作为参数;仅需要一次从lambda到函数指针的隐式转换,然后它可以很好地工作。

Func f3([]() {});直接初始化,尝试调用适当的构造函数,该构造函数Func有一个,并且期望函数指针作为参数。然后与相同f2

您可能会从复制初始化和直接初始化之间的区别中得到启发。

另外,复制初始化中的隐式转换必须直接从初始值设定项产生T,而直接初始化期望从初始值设定项到T的构造函数的参数进行隐式转换。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

复制列表初始化?为什么会编译?

来自分类Dev

Lambda重新初始化向量-为什么起作用?

来自分类Dev

为什么for循环可以初始化Java中按值传递的变量

来自分类Dev

为什么在用指针编译时不能分配const初始化

来自分类Dev

直接列表初始化可以成功编译,但是正常的直接初始化失败,为什么?

来自分类Dev

为什么不让chars数组中的std :: string初始化呢?

来自分类Dev

在构造函数中初始化变量后进行验证:为什么不这样做呢?

来自分类Dev

Kotlin 属性未初始化,但为什么呢?

来自分类Dev

C ++零初始化-为什么此程序中的`b`未初始化,而`a`已初始化?

来自分类Dev

为什么C和C ++编译器将显式初始化和默认初始化的全局变量放在不同的段中?

来自分类Dev

为什么Dart只允许在初始化列表中初始化Final变量?

来自分类Dev

为什么初始化器列表中的自初始化引用不是错误?

来自分类Dev

为什么不在 Java 中的未初始化数组上“为每个”循环

来自分类Dev

为什么此超类在初始化期间不在子类中运行方法?

来自分类Dev

为什么不必初始化数组中的结构?

来自分类Dev

为什么final可以在构造函数中初始化?

来自分类Dev

为什么在Dart中对final字段的初始化是错误的?

来自分类Dev

为什么我无法在jQuery中初始化变量?

来自分类Dev

为什么出口不能在initWithCoder中初始化?

来自分类Dev

为什么不能在数组中分配几个元素,而在定义数组时初始化数组呢?

来自分类Dev

为什么我们不能使用scanf直接初始化struct中的变量?

来自分类Dev

初始化而不在swift中传递任何参数?

来自分类Dev

为什么类数据成员不能通过直接初始化语法初始化?

来自分类Dev

为什么在堆数组初始化中调用了两次复制构造函数?

来自分类Java

为什么编译取决于实例初始化程序中引发异常的方式?

来自分类Dev

为什么不能在init块编译中初始化变量接口属性的代码?

来自分类Dev

为什么编译器会警告不要在初始化列表中隐藏成员?

来自分类Dev

为什么在 c++11 中编译指示符初始化?

来自分类Dev

为什么这种类型的最终变量初始化不能在 Java 中编译?

Related 相关文章

  1. 1

    复制列表初始化?为什么会编译?

  2. 2

    Lambda重新初始化向量-为什么起作用?

  3. 3

    为什么for循环可以初始化Java中按值传递的变量

  4. 4

    为什么在用指针编译时不能分配const初始化

  5. 5

    直接列表初始化可以成功编译,但是正常的直接初始化失败,为什么?

  6. 6

    为什么不让chars数组中的std :: string初始化呢?

  7. 7

    在构造函数中初始化变量后进行验证:为什么不这样做呢?

  8. 8

    Kotlin 属性未初始化,但为什么呢?

  9. 9

    C ++零初始化-为什么此程序中的`b`未初始化,而`a`已初始化?

  10. 10

    为什么C和C ++编译器将显式初始化和默认初始化的全局变量放在不同的段中?

  11. 11

    为什么Dart只允许在初始化列表中初始化Final变量?

  12. 12

    为什么初始化器列表中的自初始化引用不是错误?

  13. 13

    为什么不在 Java 中的未初始化数组上“为每个”循环

  14. 14

    为什么此超类在初始化期间不在子类中运行方法?

  15. 15

    为什么不必初始化数组中的结构?

  16. 16

    为什么final可以在构造函数中初始化?

  17. 17

    为什么在Dart中对final字段的初始化是错误的?

  18. 18

    为什么我无法在jQuery中初始化变量?

  19. 19

    为什么出口不能在initWithCoder中初始化?

  20. 20

    为什么不能在数组中分配几个元素,而在定义数组时初始化数组呢?

  21. 21

    为什么我们不能使用scanf直接初始化struct中的变量?

  22. 22

    初始化而不在swift中传递任何参数?

  23. 23

    为什么类数据成员不能通过直接初始化语法初始化?

  24. 24

    为什么在堆数组初始化中调用了两次复制构造函数?

  25. 25

    为什么编译取决于实例初始化程序中引发异常的方式?

  26. 26

    为什么不能在init块编译中初始化变量接口属性的代码?

  27. 27

    为什么编译器会警告不要在初始化列表中隐藏成员?

  28. 28

    为什么在 c++11 中编译指示符初始化?

  29. 29

    为什么这种类型的最终变量初始化不能在 Java 中编译?

热门标签

归档