c – 将此指针分配给对指针的rvalue引用

@H_404_1@以下示例是否编译?
struct B;
struct A
{
  A(B*&&){}
};

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

int main(){}

LWS与clang它编译,但与gcc我得到:

no known conversion for argument 1 from ‘B* const’ to ‘B*&&’

如果我添加一个const它编译.

我也想指出,MSVC也错了:

cannot convert parameter 2 from ‘B *const ‘ to ‘B *&&’

所以看起来我们有两个编译器的错误.

BUGS FILED

MSVC bug link

GCC bug link

解决方法

是的,应该编译.

将其实现为cv T * const是不正确的(其中cv是函数的cv-qualifiers,如果有的话,T是类类型).这不是const,只是内置类型的prvalue表达式(不可修改).

许多人认为,因为你不能修改它,它必须是const,但正如Johannes Schaub – litb曾经评论过很久以前,一个更好的解释是这样的:

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

// where __this is the "real" value of this

这里很明显,你不能修改这个(比如说,这个= nullptr),但是也清楚没有const对于这样的解释是必要的. (你的构造函数中的值只是临时值.)

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...