键入转换为类型&&运算符

Rya*_*ing 10 c++ c++11

我惊讶地看到以下编译:

struct C {
    operator C&&() {
        std::cerr << "ref'd\n";
        throw std::runtime_error("what is happening?");
    }
};
Run Code Online (Sandbox Code Playgroud)

具有运算符的类型,用于其自身的rvalue-reference转换.但是,我无法使用我认为可以做到的操作来调用操作符.将值传递给采用右值引用的函数失败,并且调用std::move对象不会触发任何操作.

为什么这段代码完全可以编译,有没有办法让这个函数运行?

clang给出warning: conversion function converting 'C' to itself will never be used了或不带有关于类型的引用.

小智 12

struct C
{
    operator C()
    {
    }
};
Run Code Online (Sandbox Code Playgroud)

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

转换函数从不用于将(可能是cv限定的)对象转换为(可能是cv限定的)相同的对象类型(或对它的引用),转换为该类型的(可能是cv限定的)基类(或引用它)或(可能是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
}
Run Code Online (Sandbox Code Playgroud)