隐式转换序列

时间:2014-11-21 05:07:13

标签: c++ implicit-conversion

N3797§13.3.3.1[over.best.ics]说:

  

转换序列是一个隐式转换,如中所定义   第4条[...]

但是,第4节定义了以下转换列表:

  • Lvalue-to-rvalue转换
  • 数组到指针的转换
  • 功能指针转换
  • 资格转换
  • 整体促销
  • 浮点促销
  • 整体转化
  • 浮点转换
  • 浮动积分转换
  • 指针转换
  • 指向成员转化的指针
  • 布尔转换
  • 整数转化率

考虑以下示例:

#include <iostream>

using namespace std;

struct A
{
    operator int()
    {
        return 42;
    }
};

A a;

int b = a; //User-defined conversion sequence applied

int main() { }

只要用户定义的转换不属于一组标准转换,就不会在示例中应用任何标准转换。那么我提供的报价意义何在?

1 个答案:

答案 0 :(得分:0)

你省略的其他引用可能很有启发性:

  

§13.3.3.1/ 1隐式转换序列是一个序列   转换用于将函数调用中的参数转换为该类型   被调用函数的相应参数。该   转换序列是子句中定义的隐式转换   4,表示它受初始化规则的约束   单个表达式(8.5,8.5.3)的对象或引用。

第4条确实谈到了这一点。

  

3如果和,表达式e可以隐式转换到类型T   只有声明T t=e;对于一些发明的人来说,它是完美的   临时变量t(8.5)。

     

6任何隐式转换的效果与执行相同   相应的声明和初始化然后使用   作为转换结果的临时变量。结果是   如果T是左值引用类型或右值引用,则左值   函数类型(8.3.2),如果T是对它的右值引用,则为xvalue   对象类型,否则为prvalue。表达式e用作a   glvalue当且仅当初始化将它用作glvalue时。

“完整的此类转换”(在第4条中列出)是指标准转换。请记住,它表示标准转换序列可以为空。然后§13.3.3.1.2描述了用户定义的转换序列。它包括:

  • 标准转换序列
  • 用户定义的转化
  • 另一个标准转换序列