При каких обстоятельствах будет вызываться оператор преобразования типа? - PullRequest
11 голосов
/ 02 декабря 2011

Рассмотрим тип bar, который имеет определяемые пользователем операторы преобразования в ссылки типа bar:

struct bar
{
  operator bar & ();
  operator const bar & () const;
};

Когда будут применяться эти преобразования? Кроме того, что это означает, если эти операторы были deleted? Есть ли интересное использование какой-либо из этих функций?

Следующая программа не может применить ни одно из преобразований:

#include <iostream>

struct bar
{
  operator bar & ()
  {
    std::cout << "operator bar &()" << std::endl;
    return *this;
  }

  operator const bar & () const
  {
    std::cout << "operator const bar &() const" << std::endl;
    return *this;
  }
};

void foo(bar x)
{
}

int main()
{
  bar x;

  bar y = x;         // copy, no conversion

  y = x;             // assignment, no conversion

  foo(x);            // copy, no conversion

  y = (bar&)x;       // no output

  y = (const bar&)x; // no output

  return 0;
}

Ответы [ 4 ]

9 голосов
/ 02 декабря 2011

C ++ 11 §12.3.2

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

2 голосов
/ 02 февраля 2013

Функция, которая позволяет вам определять функцию преобразования от типа к себе, но функция преобразования никогда не используется, может быть полезной функцией в шаблонном программировании, где два параметра типа могут относиться или не относиться к одному и тому же. тип, в зависимости от экземпляра. Некоторый мой код полагается на эту функцию. Это избавляет от необходимости предоставлять специализации для случаев, когда два или более параметра типа в конечном итоге ссылаются на один и тот же тип.

1 голос
/ 02 декабря 2011

Я не вижу никаких причин, почему это когда-либо будет называться. Функции преобразования вызываются для ... преобразования. Если у вас уже есть правильный тип, нет абсолютно никакой причины добавлять операцию преобразования перед копированием.

0 голосов
/ 05 февраля 2016

Только для записи. Мне удалось создать такую ​​структуру в более крупном программном проекте, я слепо доверял предупреждению компилятора и удалил «никогда не используемый метод». Ну, я думаю, я нашел сценарий, где он на самом деле называется. Компилятор, кажется, пропустил базовый класс.

#include <iostream>

struct D;
struct B
{
    virtual operator D& ()
    {
        throw "foo";
    }
};

struct D : public B
{
    virtual operator D& ()
    {
        std::cout << "bar" << std::endl;
        return *this;
    }
};

int main()
{
    B* b = new D();
    D& d = *b;

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...