c++ - 临时实现转换不在标准转换顺序中
问题描述
临时物化转换是一种标准转换,见§ 7.3 标准转换;7.3.4 [conv.rval]:
类型的纯右值
T
可以转换为类型的 xvalueT
。此转换通过使用临时对象作为其结果对象评估纯右值,从纯右值初始化一个类型的临时对象([class.temporary])T
,并产生一个表示临时对象的 xvalue。T
应该是一个完整的类型。
但是为什么标准转换序列列表中没有提到它?
见[conv]/1:
标准转换序列是按以下顺序的标准转换序列:
从以下集合进行零次或一次转换:左值到右值的转换、数组到指针的转换和函数到指针的转换。
以下集合中的零个或一个转换:整数提升、浮点提升、整数转换、浮点转换、浮点整数转换、指针转换、指针到成员的转换和布尔转换。
零或一函数指针转换。
零个或一个资格转换。
是否因为必须以任何一种方式创建对象,因此不会影响确定转换顺序是否优于另一个?
解决方案
是否因为必须以任何一种方式创建对象,因此不会影响确定转换顺序是否优于另一个?
是的,临时实现不是一种选择,所以它是“免费的”并且不受 ICS 排名的影响。它在需要时应用,请参阅[expr.basic.lval]/7:
每当prvalue作为操作数的操作数出现时,该操作数需要glvalue,临时实现转换将应用于将表达式转换为xvalue。
例如,点表达式要求左边是一个左值:
struct X {
void func(int) { }
void func(long) { }
};
int n = 1;
X().func(n);
在这里X()
prvalue必须首先成为一个xvalue(物化),然后我们才能继续.func(n)
,此时ICS排名开始决定如何调用func(n)
,因为可能有不同的转换序列导致不同的选择。
推荐阅读
- vue.js - 测试使用 cytoscape.js 的 Vue 组件?
- reactjs - Redux 状态结构
- css - CSS 列填充自动忽略打印的分页符
- javascript - 如果 HTML 文本超过一定长度并且 HTML 标记已关闭,则显示“阅读更多”链接
- c++ - 使用 Bazel 生成 QT 资源文件
- javascript - 如何合并两个大小相同的不同对象数组?
- c++ - cout fails to give output probably due to inline assembly
- python-3.x - ansible 无法验证目标目录
- javascript - fullcalendar 两班日历,着色周
- python - 记忆和功能跟踪