奇怪的隐式转换C++
strange implicit conversion on C++
我有一个关于意外转换的问题:
class BadString
{
public:
BadString(char const*);
...
char& operator[] (size_t); //(1)
char const& operator[] (size_t);
operator char* (); //(2)
operator char const* ();
};
int main()
{
BadString str("correkt");
str[5] = 'c'; //possibly an overload resolution ambiguity !!!
}
解释是这样的:
(1) 处的下标运算符似乎是完美的匹配。但是,它不是很完美,因为参数 5 具有 int 类型,并且运算符期望size_t(无符号 int 或无符号 long,但从不 int)。尽管如此,简单的标准整数转换使 (1) 很容易可行。 但是,还有另一个候选者:内置下标运算符。实际上,如果我们将转换运算符 (2) 应用于 str,我们将获得一个指针类型,现在内置的下标运算符适用。这个运算符采用ptrdiff_t参数,在许多平台上等效于 int。
我知道 (1) 的原始参数不匹配,然后会发生隐式转换,但我不明白为什么编译器会尝试使用 (2) 转换 str。
谢谢。
如果我像这样"扩展"您的代码并使第二个下标运算符方法const,那么结果将是
#include <iostream>
#include <cstring>
class BadString {
public:
char s[1024];
BadString(const char* s_) {
strncpy(s, s_, strlen(s_) + 1);
}
char& operator[](size_t pos) {
return s[pos];
}
const char& operator[](size_t pos) const {
return s[pos];
}
operator char*() {
std::cout << "operator char*n";
}
operator const char*() {
std::cout << "operator const char*n";
}
};
int main() {
BadString bs("correkt");
bs[5] = 'c';
std::cout << bs.s << "n";
}
然后编译并运行,它按预期工作,输出只有一行
correct
发生隐式转换运算符(2)
这一事实意味着您没有提供有关BadString
类的完整信息。也许你应该这样做。
而且,当然,如果它像提供的示例一样实现,则没有任何理由调用隐式转换运算符(2)
。
UPD:考虑到你在评论中提到的内容,我想目的是 operator const char*()
是像这样的显式转换
(const char*)bs
返回指向数组的第一个元素的指针 s
,bs
持有该元素。也就是说,当然,不正确,而且有点丑,但我看到唯一的选择。
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 了解 GLM- openGL 中的相机转换
- 将无符号char*转换为std::istream*C++