Подстрочный оператор и неявное преобразование в тип указателя - PullRequest
0 голосов
/ 25 января 2019

Я читаю шаблоны C ++ - полное руководство, 2-е издание и B.2.1 рассказывает о неявном преобразовании подразумеваемого аргумента "this".

Тот же пример здесь: http://www.open -std.org/jtc1/sc22/wg21/docs/papers/2004/n1592.pdf

В зависимости от typedef для ptrdiff_t, компилятор может сделать вывод о наличии неоднозначности между BadString:: operator [] и преобразование подразумеваемого аргумента "this" в char * и использование встроенного оператора индекса.

Может кто-нибудь объяснить, как выражение obj [0] связано с этим преобразованием и почемуКомпилятор действует так, как действует в трех примерах ниже?

Спасибо.

int main() {
    abc x;
    auto first = x[1];
    auto second = x + 2;
    return 0;
}

Работает (почему?):

struct abc
{
    operator bool *() { return {}; }
};

Не работает (почему):

struct abc
{
    template <typename T>
    operator T *() = delete;
};

template <>
abc::operator int *() { return {}; }

Не работает (использование перегруженного оператора '[]' неоднозначно):

struct abc
{
    operator bool *() { return {}; }
    template <typename T>
    operator T *() = delete;
};

template <>
abc::operator int *() { return {}; }
...