【问题标题】:Implicit conversion sequence隐式转换序列
【发布时间】:2015-01-19 04:38:01
【问题描述】:

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

转换序列是隐式转换,如 第 4 条 [...]

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

  • 左值到右值的转换
  • 数组到指针的转换
  • 函数到指针的转换
  • 资格转换
  • 整体促销
  • 浮点推广
  • 积分转换
  • 浮点转换
  • 浮点-积分转换
  • 指针转换
  • 指向成员转化的指针
  • 布尔转换
  • 整数转换排名

考虑以下示例:

#include <iostream>

using namespace std;

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

A a;

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

int main() { }

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

【问题讨论】:

    标签: c++ implicit-conversion


    【解决方案1】:

    您省略的其余引用可能很有启发性:

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

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

    3 如果和 仅当声明T t=e;是良构的,对于一些发明的 临时变量t (8.5)。

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

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

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

    【讨论】:

    • 谢谢,但还是不太清楚。该标准稍后将格式良好的显式转换序列定义为以下来源之一:标准转换序列(13.3.3.1.1)用户定义的转换序列(13.3 .3.1.2),或省略号转换序列 (13.3.3.1.3).
    • 或者你的意思是我引用的引用中出现的隐式转换序列转换序列有点不同,是吗?
    • @DmitryFucintv 据我了解,标准转换序列 is 是一种隐式转换。我在澄清“第 4 条中定义的隐式转换”是指它谈论“隐式转换”的段落。
    • 啊,那不是对转换顺序的定义,而是对第4条的澄清,是吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多