对由文字实例化的对象的类引用

时间:2019-04-19 13:36:02

标签: c++

这是怎么回事?

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

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

2 个答案:

答案 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;