Конкретные вещи с оператором приведения типа - PullRequest
3 голосов
/ 30 апреля 2011
#include <iostream>
using namespace std;

struct A
{
    A(int a):a(a){}
    int a;
};

struct B
{
    operator A()
    {
        return 10;
    }
};

int main()
{
    B b;
    cout << ((A)b).a << endl;
    return 0;
}

Этот код компилирует и печатает 10 в visual studio.Но в википедии рядом с оператором приведения я нашел это предложение: Note: for user-defined conversions, the return type implicitly and обязательно matches the operator name.

Теперь, как работает код выше?Это особенность визуальной студии?Или это должно соответствовать только неявно?

Ответы [ 2 ]

6 голосов
/ 30 апреля 2011

operator A() - пользовательский оператор преобразования. Его задача состоит в том, чтобы возвращать A по значению при приведении B к A.

Ваша operator A() функция возвращает целочисленное литеральное значение, 10. Но operator A должен возвращать A, поэтому конструктор преобразования A вызывается со значением 10. Это приводит к созданию временного A. Затем вы получаете доступ к .a для этого временного объекта и вставляете значение .a в поток, в результате чего вы видите 10 на экране.

EDIT

Когда вики сказал, что оператор разговора «неявно» возвратил A, это означало, что вам не нужно указывать тип возврата в выражении функции. Это всегда A, и с этим ничего не поделаешь.

Когда вики сказала, что она "обязательно" вернула A, это означало, что она не может вернуть ничего, кроме A. Он даже не может вернуть ничего конвертируемого в A. Он должен вернуть A точно.

1 голос
/ 30 апреля 2011

B::operator A() неявно возвращает A.Следовательно, return 10 неявно эквивалентно return (A)10 или return A(10).

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