我对标准转换序列术语有误解。我遇到了以下引用N3797§8.5.3/5[dcl.init.ref]:
-如果初始值设定项表达式
-是xvalue(但不是位字段)、类prvalue、数组prvalue或函数左值,并且“cv1 T1”与“cv2 T2”引用兼容,或者
-具有类类型(即T2为类类型),其中T1与T2无关,可转换为“cv3 T3”类型的xvalue、class prvalue或函数左值,其中“cv1 T1”与“cv3 T3”是参考兼容的(见13.3.1.6),
[..] 在第二种情况下,如果引用是右值引用,并且用户定义的转换序列的第二标准转换序列包括左值到右值的转换,则程序是html" target="_blank">格式错误的。
这里的第二个标准转换序列是什么?我以为有一个标准转换序列,包括所有必要的标准转换(用户定义的和隐式的)。
标准转换术语的含义包含在C标准的以下条款中:
>
标准转换是具有内置含义的隐式转换。第4条列举了此类转换的全集。标准转换序列是按以下顺序进行的标准转换序列:
-从以下设置的零或一个转换:左值-to-右值转换、数组到指针转换和函数到指针转换。
-以下集合中的零或一个转换:整数提升、浮点提升、整数转换、浮点转换、浮点积分转换、指针转换、指针到成员转换和布尔转换。
-零或一个资格转换。
[注:标准转换序列可以为空,即它可以不包含任何转换。-结束注释]
如果需要将表达式转换为所需的目标类型,将对其应用标准转换序列。
换句话说,标准转换是编译器在将一种类型转换为另一种类型时可以应用的一组内置规则。这些内置转换包括:
在用户定义的转换顺序期间,标准转换顺序可以出现两次——在用户定义的转换之前和/或之后:
>
第二个标准转换序列将用户定义转换的结果转换为序列的目标类型。由于隐式转换序列是初始化,因此在为用户定义的转换序列选择最佳用户定义转换时,适用用户定义转换初始化的特殊规则(参见13.3.3和13.3.3.1)。
话虽如此,对于以下转换:
A a;
B b = a;
>
编译器将在B
中搜索转换构造函数,该构造函数可以通过一些初始标准转换序列获取A
(源代码类型)的实例,以便它可以然后通过选择的构造函数执行用户定义的转换,然后应用另一个标准转换-第二个标准转换-用于将用户定义转换的结果类型转换为目标类型;
或者:
编译器将在A
中搜索转换函数,该函数在隐式上下文的某个初始标准转换序列后可调用,然后可以将A
的实例转换为通过另一个标准转换(第二个标准转换)转换为目标类型B
的某种类型。
作为一个具体的例子,让我们考虑以下转换:
struct A
{
operator int() const;
};
A a;
bool b = a;
编译器考虑以下用户定义的转换序列:
>
自定义转换:通过自定义转换功能将A
转换为int
。
第二种标准转换:将int
转换为bool
。
您询问的案例可以按如下方式进行拆分:
struct A
{
operator int&();
};
int&& b = A();
A
int
[...] 如果引用是右值引用,并且用户定义的转换序列的第二个标准转换序列包括左值到右值的转换,则程序的格式不正确。
该转换不适用于整个用户定义的转换序列。
[over.ics.user]:
用户定义的转换由初始标准转换序列、用户定义转换(12.3)和第二个标准转换序列组成。[…]
第二个标准转换序列将用户定义的转换结果转换为序列的目标类型。
例如
struct A
{
operator int();
};
void foo(short);
foo(A());
第二个标准转换序列将int
prvalue转换为foo
的参数,即short
。第一个标准转换序列将A
对象转换为A
(操作符int的隐式对象参数),这构成了身份转换
对于参考,您引用的规则提供了一个示例:
struct X {
operator B();
operator int&();
} x;
int&& rri2 = X(); // error: lvalue-to-rvalue conversion applied to
// the result of operator int&
这里,运算符int
您可以在David Vandevoorde和Nicolai Josuttis的《C++模板完整指南》一书的附录B中找到下面的文本。 null 几页后,这本书展示了以下示例和文本(重点是我的): 起初,表达式STR[5]似乎没有任何歧义。(1)处的下标运算符似乎是一个完美的匹配。但是,它并不十分完美,因为参数5的类型是int,而运算符期望的是无符号整数类型(size_t和STD::size_t通常具
主要内容:JSF自定义转换器实例我们可以在JSF中创建自己的自定义转换器。 以下列表是我们可以在JSF中创建自定义转换器的步骤。 通过实现接口创建一个转换器类。 实现上述接口的和方法。 使用注解为自定义转换器分配唯一的ID。 JSF自定义转换器实例 打开 NetBeans IDE 创建一个Web工程:CustomConverter,其目录结构如下所示 - 创建以下文件代码,文件:index.xhtml 的代码内容如下所示 - 文
I'v开始寻找很好的解决方案,如何使用Spring CassandraOperations很好地持久化实体。问题的出现是因为我的实体中的某些字段不支持cassandra,例如joda DateTime。 解决方法是在java类型的同一实体中有其他字段。util。Date而不是joda DateTime,用@Transient标记未要求的字段。但这并不干净,所以我开始寻找自动自定义转换。 目前,sp
问题内容: 我正在寻找一种用于SQL中自定义单位转换的解决方案,我公司使用的数据库是Microsoft SQL Server,因此我需要编写一个SQL以返回基于“单位转换表”的转换因子 说: 单位换算表: 问题:如果我有10盒,以克为单位的鸡翅的期末存货是多少? 如何编写此sql返回“转换因子”? 提前致谢 问题答案: 我认为递归表最好找到从您期望的单位到期望的单位之间的路径。这样的事情(这假设数
由来 Hutool中类型转换最早只是一个工具类,叫做“Convert”,对于每一种类型转换都是用一个静态方法表示,但是这种方式有一个潜在问题,那就是扩展性不足,这导致Hutool只能满足部分类型转换的需求。 解决 为了解决这些问题,我对Hutool中这个类做了扩展。思想如下: Converter 类型转换接口,通过实现这个接口,重写convert方法,以实现不同类型的对象转换 ConverterR
我为jsf创建了一个自定义转换器。getAsObject()工作正常,但getAsString()返回异常。我不确定问题出在哪里,我尝试过用不同的方式将对象转换为字符串,但它不断返回异常。 这是我的代码: 这是Product类(为简单起见排除了getter/Setters/equals()/hash()): 这是stack我得到的: 这是我使用转换器的jsf: