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

为什么用户定义的转换比标准整数转换更匹配?

耿炎彬
2023-03-14

您可以在David Vandevoorde和Nicolai Josuttis的《C++模板完整指南》一书的附录B中找到下面的文本。

    null

几页后,这本书展示了以下示例和文本(重点是我的):

class BadString {
    public:
    BadString(char const*);
    ...
    // character access through subscripting:
    char& operator[] (size_t); // (1)
    char const& operator[] (size_t) const;
    // implicit conversion to null-terminated byte string:
    operator char* (); // (2)
    operator char const* ();
    ...
};
int main()
{
    BadString str("correkt");
    str[5] = 'c'; // possibly an overload resolution ambiguity!
}

起初,表达式STR[5]似乎没有任何歧义。(1)处的下标运算符似乎是一个完美的匹配。但是,它并不十分完美,因为参数5的类型是int,而运算符期望的是无符号整数类型(size_t和STD::size_t通常具有无符号int或无符号long,但绝不是int类型)。不过,一个简单的标准整数转换使(1)变得容易可行。但是,还有另一个可行的候选:内置下标运算符。实际上,如果我们将隐式转换运算符应用于str(它是隐式成员函数参数),我们将获得一个指针类型,现在应用内置下标运算符。这个内置运算符接受ptrdiff_t类型的参数,在许多平台上,该参数等效于int,因此是参数5的完美匹配。因此,即使内置的下标运算符对隐含参数的匹配很差(通过用户定义的转换),但对于实际的下标,它比在(1)处定义的运算符更好!因此潜在的模糊性。

共有1个答案

刘选
2023-03-14

注意,第一个列表是简化的重载解析。

为了删除关于int是否与ptrDiff_t相同的“可能”和“可能”,让我们更改一行:

str[(ptrdiff_t)5] = 'c'; // definitely an overload resolution ambiguity!

现在,我从g++得到的消息是:

struct S {
    explicit S(int) {}
    operator int() { return 0; }
};

void foo(const S&, long) { }
void foo(int, int) { }

int main() {
    S s(0);
    foo(s, 1);
}

现在你要向我要标准引文,但我要用我需要打干草的事实作为不查它的借口;-)

总之,这里的“用户定义的转换比标准整数转换更匹配”是不正确的。然而,在这种情况下,标准将两个可能的重载定义为同样好,因此调用是不明确的。

 类似资料:
  • 我对标准转换序列术语有误解。我遇到了以下引用N3797§8.5.3/5[dcl.init.ref]: -如果初始值设定项表达式 -是xvalue(但不是位字段)、类prvalue、数组prvalue或函数左值,并且“cv1 T1”与“cv2 T2”引用兼容,或者 -具有类类型(即T2为类类型),其中T1与T2无关,可转换为“cv3 T3”类型的xvalue、class prvalue或函数左值,其

  • 问题内容: 我有一个这样的枚举: 现在我从外部输入中获取一个int并想要匹配的输入-如果不存在值,则抛出异常是可以的,但最好是 在这种情况下。 问题答案: 您需要手动执行此操作,方法是在将Integer映射到枚举的类中添加一个静态映射,例如

  • 问题内容: 我想知道是否有任何方法可以将Integer类型的变量转换为BigInteger。我尝试类型转换Integer变量,但出现一个错误消息,指出不可转换的类型。 问题答案: 您想要的方法是BigInteger#valueOf(long val) 。 例如, 首先创建String是不必要的,也是不希望的。

  • 问题内容: 我需要使用反射获取字段的值。碰巧我并不总是确定该字段的数据类型是什么。为此,为了避免某些代码重复,我创建了以下方法: 并使用如下方法: 要么 问题是我似乎无法转换为: 有没有更好的方法来实现这一目标? 我正在使用Java 1.6。 问题答案: 不,即使可以从转换为,也无法转换为。对于已知为数字的 单个 值,并且想要获得长整型值,可以使用: 对于数组,这将比较棘手…

  • 问题内容: 我有Hibernate方法,它返回给我一个BigDecimal。我有另一个API方法,我需要将该数字传递给它,但是它接受Integer作为参数。我不能更改两种方法的返回类型或变量类型。 现在如何将BigDecimal转换为Integer并将其传递给第二种方法? 有没有解决的办法? 问题答案: 您将致电(或仅致电),如果您丢失了信息,它甚至会引发异常。返回一个int,但是自动装箱可以解决

  • 在 C (n1570 7.21.6.1/10) 和 C(通过包含 C 标准库)中,向类型与其转换规范不匹配的 printf 提供参数是未定义的行为。一个简单的例子: 格式字符串指定 int,而参数是浮点类型。 这个问题的灵感来自一个用户的问题,他遇到了大量转换不匹配的遗留代码,这显然没有伤害,参见。理论和实践中的未定义行为。 最初,仅仅声明格式不匹配的UB似乎很激烈。很明显,输出可能是错误的,这取