Подстрочный оператор и неявное преобразование в тип указателя
Я читаю шаблоны 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 {}; }