我正在阅读C ++模板-《完整指南》(第二版)和B.2.1讲述了隐式“ this”参数的隐式转换。
同一示例: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1592.pdf
根据ptrdiff_t的typedef,编译器可能会推断出两者之间存在歧义 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 {}; }