C++ 对重载整数构造函数的不明确调用

C++ 对重载整数构造函数的不明确调用,c++,c++11,integer,type-conversion,integer-promotion,C++,C++11,Integer,Type Conversion,Integer Promotion,我将提供这两名施工人员 BigUnsigned(int value) :BigUnsigned(static_cast<unsigned long long>(value)){ } BigUnsigned(unsigned long long value); 因此,在我的例子中,构造函数参数的类型(整型文字)如果属于范围 是int --->调用BigUnsigned(int) (数值限制::max(),数值限制::max()>是长整数 --->暧昧 (数值限制::max()

我将提供这两名施工人员

BigUnsigned(int value)
    :BigUnsigned(static_cast<unsigned long long>(value)){
}
BigUnsigned(unsigned long long value);
因此,在我的例子中,构造函数参数的类型(整型文字)如果属于范围

int

--->调用BigUnsigned(int)

(数值限制::max(),数值限制::max()>
长整数

--->暧昧

(数值限制::max(),文字太大)
long-long-int

--->暧昧

如何在不声明更多构造函数或显式转换参数的情况下解决歧义


整数提升
整数转换
上可能会有用。不过,我仍然不知道这两种方法中的哪一种适用于我的情况。

这里的一个基本问题是,十进制文字永远不会被推断为无符号类型。因此,太大而不适合整数的十进制文字最终需要有符号->无符号在一种情况下是整数转换,在另一种情况下是long->int转换。这两种转换都被归类为“整数转换”,因此两者都不被认为是“更好”的转换,并且重载是不明确的

至于在不显式抛出参数或添加更多构造函数的情况下处理此问题的可能方法,我可以看到一些

至少对于文字,可以添加一个后缀,指定文字的类型为无符号:

BigUnsigned a(5000000000U); // unambiguous
另一个(也仅适用于文字)是使用十六进制或八进制文字,这(根据表6中未引用的部分)可以推断为有符号或无符号。但这只是一个部分修复——它只适用于将推断为无符号的值。对于具有32位int、32位长和64位长的典型系统,我相信它会是这样的:

因此,对于一个足够大的参数,它不适合有符号的long-long,这将给出一个明确的调用,其中十进制常量仍然是不明确的

对于那些使用较小类型的人来说,从unsigned long到unsigned long long的转换一开始可能会被认为是一种提升,而不是转换,这会使它更可取所涉及的类型是
unsigned short
unsigned int
,这是完全正确的——但这种特殊的优先权只适用于转换等级小于
int
的类型(基本上转换为:小于int的类型)

这就解决了一个数字范围的问题,但前提是它们是文本,并且只在它们属于一个特定的(尽管相当大)范围时


对于更一般的情况,唯一真正的解决方法是更改接口。要么删除
int
的重载,要么添加更多的ctor重载,特别是
unsigned
long-long
的重载。如果您决定需要,可以像现有的
int
的构造函数一样委托它们ll(但最好只使用
unsigned long
的构造函数,然后使用它)。

您需要
int
构造函数吗?不需要
biunsigned(unsigned long long value)
覆盖您想要的所有内容?@NathanOliver似乎是这样。但是,任务迫使我实现这两个构造函数,可能就是为了解决这类问题:)。
int
参数应与位级别上的
无符号long-long
完全相同。显式是好的,隐式是坏的。如果可能的话,在第一个参数中添加一个自描述性名称。如果无法设计出一个合理的名称,那么该设计是不好的,必须扔到最近的火上。@cheers-sandhth.-Alf我不允许更改公共界面。投票结束,因为你的要求不清楚。
unsigned short
unsigned int
只是在
int
不能代表所有问题时的提升
无符号短字符的值
BigUnsigned a(5000000000U); // unambiguous