c – 转换为Type \u0026\u0026 *** 作符的类型

c – 转换为Type \u0026\u0026 *** 作符的类型,第1张

概述我很惊讶地发现以下编译: struct C { operator C&&() { std::cerr << "ref'd\n"; throw std::runtime_error("what is happening?"); }}; 具有自身r值引用转换的运算符的类型.但是,我不能让 *** 作符使用我认为可以做的.将值传递给引用rvalue引用的函数失败 我很惊讶地发现以下编译:
struct C {    operator C&&() {        std::cerr << "ref'd\n";        throw std::runtime_error("what is happening?");    }};

具有自身r值引用转换的运算符的类型.但是,我不能让 *** 作符使用我认为可以做的.将值传递给引用rvalue引用的函数失败,并且在对象上调用std :: move不会触发任何内容.

为什么这个代码可以编译,而且有什么办法可以实现这个功能来运行吗?

clang给出警告:将’C’转换为自身的转换函数将永远不会在类型上使用或不使用引用.

解决方法
struct C{    operator C()    {    }};

也被允许并给出相同的警告.在§12.3.2/ 1中提及:

A conversion function is never used to convert a (possibly
cv-qualifIEd) object to the (possibly cv-qualifIEd) same object type
(or a reference to it),to a (possibly cv-qualifIEd) base class of
that type (or a reference to it),or to (possibly cv-qualifIEd) voID.

换句话说,这不是禁止的,但根本不做任何事情. Yakk和Wintermute已经显示了成员函数调用语法的示例,但cppreference显示了脚注116中提到的虚拟调度示例(N3337,N4140中的脚注118):

struct D;struct B {    virtual operator D() = 0;};struct D : B{    operator D() overrIDe { return D(); }};int main(){    D obj;    D obj2 = obj; // does not call D::operator D()    B& br = obj;    D obj3 = br; // calls D::operator D() through virtual dispatch}
总结

以上是内存溢出为你收集整理的c – 转换为Type \u0026\u0026 *** 作符的类型全部内容,希望文章能够帮你解决c – 转换为Type \u0026\u0026 *** 作符的类型所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1235546.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存