键入转换为类型&&操作者

时间:2015-01-24 22:51:23

标签: c++ c++11

我很惊讶地看到以下编译:

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

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

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

clang为warning: conversion function converting 'C' to itself will never be used提供或不提供关于类型的引用。

2 个答案:

答案 0 :(得分:12)

struct C
{
    operator C()
    {
    }
};

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

  

转换函数永远不会用于转换(可能是   cv-qualified)对象(可能是cv-qualified)相同的对象类型   (或对它的引用),对(可能是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
}

答案 1 :(得分:3)

void foo(C&&){}
int main(){
  C c;
  foo(c.operator C&&());
}

所以,基本没用,但不完全。