Подстрочный оператор и неявное преобразование в тип указателя

Я читаю шаблоны 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 {}; }

0 ответов

Другие вопросы по тегам