Подтвердить что ты не робот

Тип с преобразованием в оператор Type &&

Я был удивлен, увидев, что следующие компиляции:

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

Тип с оператором для собственного преобразования rvalue-reference. Однако я не могу заставить оператора позвонить, используя то, что, как я думал, может это сделать. Передача значения функции, принимающей ссылку rvalue, не выполняется, а вызов std::move объекта не вызывает ничего.

Почему этот код может вообще скомпилироваться и есть ли способ запустить эту функцию?

clang дает warning: conversion function converting 'C' to itself will never be used с ссылкой или без ссылки на тип.

4b9b3361

Ответ 1

struct C
{
    operator C()
    {
    }
};

также допускается и дает такое же предупреждение. Он упоминается в п. 12.3.2/1:

Функция преобразования никогда не используется для преобразования (возможно cv-квалифицированный) объект для (возможно, cv-квалифицированного) того же типа объекта (или ссылкой на него), к базовому классу (возможно, cv-qualit) этот тип (или ссылка на него) или (возможно, cv-qualified) void.

Другими словами, это не запрещено, но это просто ничего не делает. Yakk и Wintermute уже показали примеры синтаксиса вызова функции-члена, но cppreference показывает пример виртуальной отправки, как указано в сноске 116 (N3337, сноска 118 в N4140 ):

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
}

Ответ 2

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

так, в основном бесполезно, но не полностью.