当前位置: 首页 > 知识库问答 >
问题:

C++意外隐含转换

乐宜民
2023-03-14
#include <cstddef>

struct foo
{
    int operator[](size_t i) const { return 1; }
    operator char() const { return 'a'; }
};

int main()
{
    foo f;
    f["hello"]; // compilation error desired here
}

从中提取代码的类确实需要隐式转换和运算符[]。那么,有没有一种方法可以在不明确转换的情况下防止这种行为呢?

共有1个答案

呼延英奕
2023-03-14

行编译的原因是,通过隐式转换,它可以被重新解释为'a'[“hello”];,这又与编写*(('a')+(“hello”))相同;也进行编译。

标准摘录:

5.2.1订阅:

struct foo
{
  operator char() const { return 'a'; }
  int operator[](size_t i) const { return 1; }

  // prevent accidental use of foo["hello"]
  int operator[](char const*) const = delete;
};
 类似资料:
  • 如何设置另一个操作,以及如何将setData与Uri参数以外的其他参数一起使用? 我只是一般地试图理解这两种类型的意图。

  • 我试图理解以下转换的机制 根据整数常量,的类型是。这可以通过执行轻松检查; 根据内隐转换语义学: “整数提升是对秩小于或等于int[…]秩的任何整数类型的值的隐式转换设置为int或unsigned int类型的值。“ 如下文所述 msgstr"所有有符号整数类型的行列等于相应无符号整数类型的行列" 因此,升级适用,因为的秩与的秩相同。 这种晋升被定义为 如果int可以表示原始类型的整个值范围(或原

  • 在我看来,我的缓冲区包含关于最后一个数据包步骤(路由器->my home)的信息,这些信息解释了为什么TTL值是254以及为什么我用Traceroute找到了相同的两个IP: $>traceroute qwant.com traceroute to qwant.com(194.187.168.99),30跳最大,60字节数据包 172.17.0.1(172.17.0.1)0.026 ms 0.01

  • 隐含的强制转换 隐含的 强制转换是指这样的类型转换:它们是隐藏的,由于其他的动作隐含地发生的不明显的副作用。换句话说,任何(对你)不明显的类型转换都是 隐含的强制转换。 虽然 明确的 强制转换的目的很明白,但是这可能 太过 明显 —— 隐含的 强制转换拥有相反的目的:使代码更难理解。 从表面上来看,我相信这就是许多关于强制转换的愤怒的源头。绝大多数关于“JavaScript强制转换”的抱怨实际上都

  • 堆栈溢出新增功能,一般编程功能也新增功能。我正在Android Studio上使用Java创建一个应用程序。我目前正在尝试使用firebase创建登录和注册屏幕。我自己尝试了一下,直到我决定遵循教程,而不是因为我几乎没有经验。教程讲师似乎没有问题,但我无法摆脱这个错误:意外的隐式投射到:布局标签是第35行的。 我不完全确定为什么会出现这个错误,我尝试在XML和Java文件中三重检查我的语法和标点符

  • 在我们使用Makefile时,有一些我们会经常使用,而且使用频率非常高的东西,比如,我们编译C/C++的源程序为中间目标文件(Unix下是[.o] 文件,Windows下是[.obj]文件)。本章讲述的就是一些在Makefile中的“隐含的”,早先约定了的,不需要我们再写出来的规则。 “隐含规则”也就是一种惯例,make会按照这种“惯例”心照不喧地来运行,那怕我们的Makefile中没有书写这样的