为什么缩小不会影响过载分辨率?
Why doesn't narrowing affect overload resolution?
考虑以下内容:
struct A {
A(float ) { }
A(int ) { }
};
int main() {
A{1.1}; // error: ambiguous
}
编译失败,并出现关于A::A
的模糊过载的错误。这两个候选都被认为是可行的,因为需求很简单:
第二,要使
F
是可行函数,每个实参必须存在一个隐式转换序列(13.3.3.1),将该实参转换为F
的相应形参。
虽然存在从double
到int
的隐式转换序列,但A(int )
过载实际上不是可行的(在规范的,非c++标准意义上)-这将涉及窄化转换,因此是病态的。
为什么在确定可行候选人的过程中不考虑缩小转换?有没有其他情况下,尽管只有一个候选是可行的,重载还是被认为是模棱两可的?
问题在于可以不基于类型检测窄化转换。
在c++中有非常复杂的方法在编译时生成值。
阻塞窄化转换是一件好事。使c++的重载解析比现在更复杂是一件坏事。
在确定重载解析时忽略窄化转换规则(这使得重载解析纯粹是关于类型的),然后在选择的重载导致窄化转换时出错,使重载解析变得更加复杂,并增加了一种检测和防止窄化转换的方法。
只有一个候选可行的例子是模板函数"后期"失败,在实例化和复制列表初始化期间(其中考虑explicit
构造函数,但如果选择它们,则会得到一个错误)。类似地,使用影响重载解析会使重载解析比现在更加复杂。
使窄化转换完全基于类型是不可行的。这样的更改可能会破坏大量的"遗留"代码,编译器可以证明是有效的。当大多数错误都是实际错误,而不是新编译器版本是一个混蛋时,清理代码库所需的努力是值得的。
unsigned char buff[]={0xff, 0x00, 0x1f};
在基于类型的窄化转换下会失败,因为0xff
是int
类型,这样的代码很常见。
如果这样的代码需要将int
字面量无意义地修改为unsigned char
字面量,那么很可能会以我们设置一个标志来告诉编译器停止这个愚蠢的错误而结束。
-
缩窄是编译器只知道内置类型的东西。用户定义的隐式转换不能标记为窄化或不窄化
-
一开始就不允许使用隐式窄化转换。(不幸的是,它是C兼容性所必需的。
{}
初始化禁止对内置类型进行窄化,这在一定程度上得到了纠正。
另外,当双精度数不是常量表达式或双精度数太大时,double到float是一种窄化转换。
#include <iostream>
#include <iomanip>
int main() {
double d{1.1};
float f{d};
std::cout << std::setprecision(100) << d << " " << f << 'n';
}
这通常会产生错误:
main.cpp:7:13: error: non-constant-expression cannot be narrowed from type 'double' to 'float' in initializer list [-Wc++11-narrowing]
float f{d};
^
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么擦除方法会影响结束方法
- 内联如何影响模块接口中的成员函数
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 使用分辨率定理用Z3证明
- Alt+Enter 在 Win32 应用中,管理大小调整和分辨率
- Opencv 恢复到比我设置的更高的分辨率
- 在容量内调整矢量大小时的性能影响
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 未达到的情况会影响开关外壳性能
- 在Windows(C++)中使用USB相机拍摄高分辨率照片
- 循环仅对第一行正常工作.其他行不受 for 的影响
- C/C++ 位数组分辨率转换算法
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 模板如何影响C++中隐式声明的规则?
- Windows 和 Linux 之间的相对路径分辨率差异?
- 命名空间信息会影响C++的可读性
- [[可能]]和[[不太可能]]影响程序汇编的简单示例?
- 函数对象如何影响过载分辨率
- 为什么缩小不会影响过载分辨率?