以下示例应编译吗?
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 * &&'
所以看起来我们在两个编译器中有一个错误。
BUGS FILED
MSVC错误链接
GCC错误链接
是的,那应该编译。
实施不正确 this
如 cv T* const
(其中cv是函数的cv限定符,如果有的话,和 T
是类类型)。 this
不是 const
,只是一个内置类型的prvalue表达式(不可修改)。
很多人认为因为你无法修改 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是对的 - 代码应该编译。由于某种原因,海湾合作委员会考虑了 this
指针是 const
尽管如下:
的类型 this
在类的成员函数中 X
是 X*
。如果声明了成员函数 const
,这种类型 const X*
,如果声明了成员函数 volatile
,这种类型 volatile X*
,如果声明了成员函数 const volatile
,这种类型 const volatile X*
。
所以在这种情况下, this
应该是一个prvalue B*
并且完全可以绑定 B*&&
。但是,请注意绑定时 this
到右值参考,值 this
将被复制到临时对象中,而引用将被绑定到该对象。这可确保您永远不会实际修改原件 this
值。
对“cv1”类型的引用 T1
“由”cv2“类型的表达式初始化 T2
“ 如下: