何时不考虑在C ++中选择可行的构造函数时使用用户定义的转换序列?

xskxzr

我在C ++标准草案N4582中看到以下字眼:

[over.best.ics / 4]但是,如果目标是

(4.1)构造函数的第一个参数或

(4.2)用户定义的转换函数的隐式对象参数

并且构造函数或用户定义的转换函数是通过

(4.3)13.3.1.3,当参数是类copy-initialization的第二步中的临时变量时,或者

(4.4)13.3.1.4、13.3.1.5或13.3.1.6(在所有情况下),

不考虑用户定义的转换顺序。

我对粗体部分感到困惑,并且不知道该如何理解。我编写以下程序:

#include <iostream>
using namespace std;    
struct A {
    A(int) {}
    operator int() {cout << "user-defined conversion" << endl; return 0;}
    A(A&) {} //prevent default copy
};
int main()
{
    A a = A(0);
}

它在g ++ 5.3.0中运行良好,并输出“用户定义的转换”,这意味着发生了用户定义的转换。当然,可以将其解释为临时A(0)不是复制初始化的结果接下来,将程序更改为:

#include <iostream>
using namespace std;    
struct A {
    A(int) {}
    operator int() {cout << "user-defined conversion" << endl; return 0;}
    A(A&) {} //prevent default copy
};
A foo() {return A(0);}
int main()
{
    A a = foo();
}

现在,foo()的值是从A(0)初始化的临时副本,但是程序仍然可以运行。为什么会这样?

TC

您可以阅读[dcl.init] / 17了解实际的标准语言。这里的“第二步”是指A从不b相关类型的对象中复制初始化类类型的变量在这种情况下,复制初始化分两个步骤进行:

  • 第1步:您隐式转换bA如果为此调用转换构造函数,则它将创建一个临时A
  • 步骤2:然后A根据转换结果初始化变量。(在理智的课程中,通常会省略它。)

那句话的意思是,在第二步中您不执行用户定义的转换。

例如,对于您AA a = 0;第一步,您从中创建了一个A临时目录0在第二步中,您尝试a使用该临时项进行初始化-不使用用户定义的转换。失败了,因为没有A构造函数是可行的。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Firefox getBoundingClientRect()不考虑转换

来自分类Dev

滚动时不考虑阴影

来自分类Dev

C# xls & xlsx 查询从工作表中选择而不考虑工作表名称

来自分类Dev

不考虑实例函数使用回调

来自分类Dev

字节序转换,而不考虑字节序

来自分类Dev

最大高度不考虑 css 转换

来自分类Dev

函数sscanf不考虑宽度字段

来自分类Dev

jQuery函数不考虑单击的组件

来自分类Dev

函数sscanf不考虑宽度字段

来自分类Dev

UTC 日期不考虑夏令时

来自分类Dev

TabView模态显示时不考虑选择绑定

来自分类Dev

RPM构建-不考虑%prep(未创建用户)

来自分类Dev

SwiftUI Picker选择指示器不考虑框架宽度

来自分类Dev

如何在不考虑转换的情况下计算getBoundingClientRect()?

来自分类Dev

为什么我的Imagemagick转换不考虑loop参数?

来自分类Dev

验证规则不考虑VBA函数的返回值

来自分类Dev

如何动态创建命名函数而不考虑作用域?

来自分类Dev

字符串的哈希函数,不考虑char的位置

来自分类Dev

在数组中找到最小数时不考虑负数

来自分类Dev

pytz.astimezone不考虑夏令时吗?

来自分类Dev

为什么DateTime.ToLocalTime()不考虑夏令时?

来自分类Dev

当将空白设置为nowrap时,Textarea不考虑填充

来自分类Dev

如何使用lodash比较对象而不考虑对象的顺序

来自分类Dev

使用始终返回0而不考虑值的类的问题

来自分类Dev

即使使用基数,parseInt()也不考虑前导零

来自分类Dev

使用 awk 不考虑缺失值的最大多个文件

来自分类Dev

使用cordova 和Ionic 构建的UWP 不考虑主机文件

来自分类Dev

不考虑所有空格而在mysql中选择2个串联的列

来自分类Dev

使用宏编译时使用用户定义的数学函数,或仅使用c ++中标准数学库中的函数

Related 相关文章

  1. 1

    Firefox getBoundingClientRect()不考虑转换

  2. 2

    滚动时不考虑阴影

  3. 3

    C# xls & xlsx 查询从工作表中选择而不考虑工作表名称

  4. 4

    不考虑实例函数使用回调

  5. 5

    字节序转换,而不考虑字节序

  6. 6

    最大高度不考虑 css 转换

  7. 7

    函数sscanf不考虑宽度字段

  8. 8

    jQuery函数不考虑单击的组件

  9. 9

    函数sscanf不考虑宽度字段

  10. 10

    UTC 日期不考虑夏令时

  11. 11

    TabView模态显示时不考虑选择绑定

  12. 12

    RPM构建-不考虑%prep(未创建用户)

  13. 13

    SwiftUI Picker选择指示器不考虑框架宽度

  14. 14

    如何在不考虑转换的情况下计算getBoundingClientRect()?

  15. 15

    为什么我的Imagemagick转换不考虑loop参数?

  16. 16

    验证规则不考虑VBA函数的返回值

  17. 17

    如何动态创建命名函数而不考虑作用域?

  18. 18

    字符串的哈希函数,不考虑char的位置

  19. 19

    在数组中找到最小数时不考虑负数

  20. 20

    pytz.astimezone不考虑夏令时吗?

  21. 21

    为什么DateTime.ToLocalTime()不考虑夏令时?

  22. 22

    当将空白设置为nowrap时,Textarea不考虑填充

  23. 23

    如何使用lodash比较对象而不考虑对象的顺序

  24. 24

    使用始终返回0而不考虑值的类的问题

  25. 25

    即使使用基数,parseInt()也不考虑前导零

  26. 26

    使用 awk 不考虑缺失值的最大多个文件

  27. 27

    使用cordova 和Ionic 构建的UWP 不考虑主机文件

  28. 28

    不考虑所有空格而在mysql中选择2个串联的列

  29. 29

    使用宏编译时使用用户定义的数学函数,或仅使用c ++中标准数学库中的函数

热门标签

归档