以下示例是否编译?
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
解决方法
是的,应该编译.
将其实现为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对于这样的解释是必要的. (你的构造函数中的值只是临时值.)