将此指针指定给指针的右值引用

Jes*_*ood 11 c++ rvalue-reference c++11

以下示例应该编译吗?

struct B;
struct A
{
  A(B*&&){}
};

struct B : A
{
  B() : A(this){}
};

int main(){}
Run Code Online (Sandbox Code Playgroud)

LWS上使用clang进行编译,但是使用gcc我得到:

没有已知的从'B*const'到'B*&&'的参数1的转换

如果我添加const它编译.

我还要指出MSVC也错了:

无法将参数2从'B*const'转换为'B*&&'

所以看起来我们在两个编译器中有一个bug.

BUGS FILED

MSVC错误链接

GCC错误链接

GMa*_*ckG 8

是的,那应该编译.

是不正确的实现thiscv T* const(其中cv是cv修饰符的功能,如果有的话,和T是类型).this不是const,只是一个内置类型的prvalue表达式(不可修改).

许多人认为,因为你不能修改thisconst,但正如Johannes Schaub - litb很久以前评论的那样,更好的解释是这样的:

// by the compiler
#define this (__this + 0)

// where __this is the "real" value of this
Run Code Online (Sandbox Code Playgroud)

这里显然你不能修改this(比方说this = nullptr),但也要明确不需要const这样的解释.(而你在构造函数中的值只是临时值.)

  • @GManNickG 我已经弄清楚了。将右值引用绑定到“this”将首先创建它的临时副本,然后绑定到它。所以原来的 this 指针实际上不会受到影响。 (2认同)
  • @sftrabbit:是的!相同:`int && x = 0;`. (2认同)
  • @GmanNickG是的,我刚试过`int && x = 5; x ++;`并且片刻以为我改变了数学本身.现在我们将学习用1,2,3,4,6,6,7,...... (2认同)

Jos*_*eld 6

我说clang是对的 - 代码应该编译.出于某种原因,GCC认为this指针const尽管如下:

类的this成员函数的类型XX*.如果声明了成员函数const,则其类型是const X*,如果声明了成员函数volatile,则其类型为volatile X*,如果声明了成员函数const volatile,则其类型为const volatile X*.

所以在这种情况下,this应该是一个prvalue B*并且完全可绑定B*&&.但是,请注意,绑定this到右值引用时,this将将值复制到临时对象中,而引用将绑定到该对象.这可确保您永远不会实际修改原始this值.

对类型"cv1 T1"的引用由类型"cv2 "的表达式初始化,T2如下所示:

  • [...]

  • [...]或参考应为右值参考.

    • 如果是初始化表达式

      • 是一个xvalue,类prvalue,数组prvalue或函数lvalue和[...],或

      • 有一个类类型(即T2是类类型),[...]

      然后 [...]

    • 否则,将使用非参考拷贝初始化(8.5)的规则从初始化表达式创建并初始化类型为"cv1 T1"的临时类型"cv1 T1".然后将引用绑定到临时.[...]

  • @ArmenTsirunyan嗯,这是rvalue引用的重点. (2认同)