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
是的,那应该编译.
是不正确的实现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
Run Code Online (Sandbox Code Playgroud)
这里显然你不能修改this(比方说this = nullptr),但也要明确不需要const这样的解释.(而你在构造函数中的值只是临时值.)
我说clang是对的 - 代码应该编译.出于某种原因,GCC认为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如下所示:
[...]
[...]或参考应为右值参考.
如果是初始化表达式
是一个xvalue,类prvalue,数组prvalue或函数lvalue和[...],或
有一个类类型(即T2是类类型),[...]
然后 [...]
否则,将使用非参考拷贝初始化(8.5)的规则从初始化表达式创建并初始化类型为"cv1 T1"的临时类型"cv1 T1".然后将引用绑定到临时.[...]
| 归档时间: |
|
| 查看次数: |
2031 次 |
| 最近记录: |