首页 > 解决方案 > 临时实现转换不在标准转换顺序中

问题描述

临时物化转换是一种标准转换,见§ 7.3 标准转换;7.3.4 [conv.rval]

类型的纯右值T可以转换为类型的 xvalue T。此转换通过使用临时对象作为其结果对象评估纯右值,从纯右值初始化一个类型的临时对象([class.temporary])T,并产生一个表示临时对象的 xvalue。 T应该是一个完整的类型。

但是为什么标准转换序列列表中没有提到它?

[conv]/1

标准转换序列是按以下顺序的标准转换序列:

  • 从以下集合进行零次或一次转换:左值到右值的转换、数组到指针的转换和函数到指针的转换。

  • 以下集合中的零个或一个转换:整数提升、浮点提升、整数转换、浮点转换、浮点整数转换、指针转换、指针到成员的转换和布尔转换。

  • 零或一函数指针转换。

  • 零个或一个资格转换。

是否因为必须以任何一种方式创建对象,因此不会影响确定转换顺序是否优于另一个?

标签: c++language-lawyerimplicit-conversion

解决方案


是否因为必须以任何一种方式创建对象,因此不会影响确定转换顺序是否优于另一个?

是的,临时实现不是一种选择,所以它是“免费的”并且不受 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),因为可能有不同的转换序列导致不同的选择。


推荐阅读