首页 > 解决方案 > 对由文字实例化的对象的类引用

问题描述

这里发生了什么?

struct A {
    A (int){std::cout<<'A';}
};
const A& a = 3;

我的假设是由于文字3rvalue,因此应用了临时实现转换。通过调用构造函数创建一个临时对象,从而打印A并将引用绑定到结果对象。

标签: c++

解决方案


你是对的。是对 const 限定的类类型a的左值引用[dcl.ref]/2 ,初始化表达式是非类类型[lex.icon]/23的纯右值[expr.prim.literal]/1 ,既不是引用- 与[dcl.init.ref]/4相关或参考兼容。因此,[dcl.init.ref]/5.4.1似乎适用。有一个转换构造函数[class.conv.ctor]/1,它将用于转换为类型的纯右值,然后用于初始化引用。这一次,初始化表达式现在是类型的纯右值,它是与 相关的引用。因此,[dcl.init.ref]/5.3int const A 3const Aconst Aconst A应该应用,这将执行临时实现[conv.rval]。在进程中创建的临时对象的生命周期将被延长[class.temporary]/6,因为它被绑定到a位于全局命名空间范围内的引用......


推荐阅读