首页 > 解决方案 > 形成隐式转换序列的要求是矛盾的

问题描述

[over.best.ics.general] p1 说

隐式转换序列是用于将函数调用中的参数转换为被调用函数的相应参数类型的转换序列。转换序列是 [conv] 中定义的隐式转换,这意味着它受用于初始化对象或引用单个表达式 ([dcl.init], [dcl.init.ref]) 的规则控制

[over.best.ics.general] p9 说

如果找不到将参数转换为参数类型的转换序列,则无法形成隐式转换序列。

[conv.general] p3 说

当且仅当声明 T t=E; 时,表达式 E 可以隐式转换为类型 T ;对于某些发明的临时变量 t ([dcl.init]),格式良好

考虑这个例子

struct A{
  A(int) = delete;
};
struct B{
   B(int) {}
};
void fun(A);  //#1
void fun(B);  // #2
int main(){
    fun(0);  // #3
}

由于 ,A t = 0;格式不正确,因此表达式 "0" 不能隐式转换为 type A,因此可以说我们找不到将 "0" 转换为 type 的隐式转换A。因此,根据 [over.best.ics.general] p9,它不能为#1. 然而,这种解释不符合大多数实现,这些实现将示例视为歧义。尽管 [over.best.ics.general] p2 打算避免关注它没有提到的这些属性(即#1是一个可行的功能)

隐式转换序列只关心参数的类型、cv 限定和值类别,以及如何转换这些以匹配参数的相应属性

但是,由于发明的声明格式不正确;无法进行隐式转换,不正是关于如何转换这些以匹配参数的相应属性吗?我认为这些关于如何形成隐式转换序列的规则是矛盾的。它是否被视为缺陷?

标签: c++language-lawyerc++20

解决方案


推荐阅读