由于的隐式转换,下面的代码得以编译char
。我不知道为什么,因为唯一的隐式转换我希望(并期望失败)是从char const*
到size_t
。
#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
}
隐式转换在这里可以进行编译是什么?如果删除operator char
或删除,explicit
则编译将在所需位置失败。
确实从中提取此代码的类确实需要隐式转换和operator[]
。那么有没有办法在不明确显示转换的情况下防止这种行为?
行编译的原因是,通过隐式转换,可以将其重新解释为'a'["hello"];
,这又与*(('a')+("hello"));
也可以编译的编写相同。
标准摘录:
5.2.1下标:
...表达式E1 [E2](根据定义)与*((E1)+(E2))相同...
不明确显示转换运算符的最简单解决方法是将有问题的下标运算符声明为已删除:
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;
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句