这是怎么回事?
struct A {
A (int){std::cout<<'A';}
};
const A& a = 3;
我的假设是,因为文字3
是 rvalue ,所以应用了临时物化转换。通过调用构造函数来创建一个临时对象,从而打印A
并将引用绑定到结果对象。
答案 0 :(得分:2)
您是正确的。 a
是对const限定的类类型的左值引用[dcl.ref]/2,初始化表达式3
是非类类型int
的prvalue [expr.prim.literal]/1 { 3}}与const A
[lex.icon]/2既不参考也不参考兼容。因此,[dcl.init.ref]/4似乎适用。有一个转换构造函数[dcl.init.ref]/5.4.1,该构造函数将用于将3
转换为类型const A
的prvalue,然后将其用于初始化引用。这次,初始化器表达式现在是类型为const A
的prvalue,它与const A
有关。因此,应该应用[class.conv.ctor]/1,它将执行临时实现[dcl.init.ref]/5.3。在该过程中创建的临时对象的生存期将延长[conv.rval],因为它已绑定到位于全局命名空间范围内的引用a
上。
答案 1 :(得分:0)
发生了隐式转换。它从3
转换为A
的对象,然后引用a
指向该对象。
更好的做法是在构造函数中添加关键字explicit
,该关键字仅采用一个这样的参数。那么就不会发生隐式转换。那么下面的代码将引发错误。
请参阅: https://www.geeksforgeeks.org/g-fact-35/
https://www.learncpp.com/cpp-tutorial/9-13-converting-constructors-explicit-and-delete/
struct A {
explicit A (int){std::cout<<'A';}
};
const A& a = 3;