将此指针赋值给指针的右值引用
Assigning this pointer to rvalue reference to a pointer
下面的示例应该编译吗?
struct B;
struct A
{
A(B*&&){}
};
struct B : A
{
B() : A(this){}
};
int main(){}
在LWS上使用clang可以编译,但是使用gcc我得到:
实参1没有从'B* const'到'B*&&'的已知转换
如果我添加一个const
,它会编译。
我还想指出MSVC也犯了错误:
无法将形参2从'B *const '转换为'B *&&'
所以看起来我们在两个编译器中有一个错误
bug提交
MSVC bug link
是的,应该可以编译。
将this
实现为cv T* const
是不正确的(其中cv是函数的cv限定符,如果有的话,T
是类类型)。this
不是const
,它只是一个内置类型的右值表达式(不可修改)。
许多人认为,因为你不能修改this
,所以一定是const
,但正如Johannes Schaub - litb很久以前评论的那样,一个更好的解释是这样的:
// by the compiler
#define this (__this + 0)
// where __this is the "real" value of this
这里很明显,您不能修改this
(例如this = nullptr
),但也很清楚,对于这样的解释,没有const
是必要的。(构造函数中的值就是临时变量的值)
我说clang是对的——代码应该可以编译。由于某些原因,GCC认为this
指针是const
,尽管有以下规定:
类
X
的成员函数中this
的类型为X*
。如果成员函数声明为const
,则this的类型为const X*
;如果成员函数声明为volatile
,则this的类型为volatile X*
;如果成员函数声明为const volatile
,则this的类型为const volatile X*
。
所以在这种情况下,this
应该是一个右值B*
,并与B*&&
完全绑定。但是,请注意,当将this
绑定到右值引用时,this
的值将被复制到一个临时对象中,而引用将被绑定到该对象。这可以确保您永远不会实际修改原始this
值。
对类型"cv1
T1
"的引用由类型"cv2T2
"的表达式初始化,如下所示:
[…]
[…]或引用必须是右值引用。
如果初始化表达式
是一个xvalue,类的右值,数组的右值或函数的左值和[…]),或者
有一个类类型(例如,T2是一个类类型 ), [...]
然后[…]
否则,使用非引用复制初始化的规则从初始化表达式创建并初始化类型为"cv1 T1"的临时对象。然后将引用绑定到临时对象。[…]
- 如何使用基类指针引用派生类成员
- 将常量指针引用绑定到非常量指针
- 如果非动态变量被指针引用,何时超出范围?
- 转换指针引用的字符串
- 指针引用的生存期(以 C++为单位)
- 从 unique_ptr::get 发送指针作为指针引用进入函数
- 指针/引用的 CLion 格式
- 使用模板专用化来比较指针引用
- 如何保存指向抽象基类的指针/引用,但在 c++ 中仍然可以复制
- C++初始化指针/引用/复制细微差别
- 用数组或指针引用函数?
- 指针范围问题和返回类中封装的指针向量内的指针引用
- 强制转换为指针引用是否会导致未定义的行为
- 访问由 void 指针引用的结构的成员
- C 为什么当先前的步骤引发异常时,std :: shared_ptr的指针引用会被破坏
- 动态指针引用数组由三元运算符返回值,但有异常
- 悬空指向 int 和 char* 常量的指针/引用
- C++ 二维数组和指针引用
- 通过使用指针/引用,在C++中使用向量加快计算速度
- C++非类型模板模板到函数指针/引用