不同类的构造函数的重载解析
Overload resolution of constructors for different classes
请考虑此代码。
struct A {
int i;
};
struct B {
char c;
};
struct C {
double d;
};
void f(A a);
void f(B b);
void f(C c);
void g()
{
f({5});
}
在这里,我在f({5});
中得到了歧义.但似乎struct A
的构造函数与{5}
完全匹配,而第二个需要积分提升,而最后一个需要浮点转换。
那么为什么会有歧义呢?
即使序列中的第一个转换的排名较差,这两个转换序列最终也会成为用户定义的转换,因为它们都转换为用户定义的类型。
[结束.ics.用户]
1 用户定义的转换序列由初始标准组成 转换序列,后跟用户定义的转换 ([class.conv](,后跟第二个标准转换序列。
隐式转换序列中任意位置的用户定义转换会为整个序列提供"用户定义的转换"等级。因此,这两个转换序列实际上具有相同的等级,因此两者都不比另一个更好。
因此,函数调用是不明确的。
这是因为整数可以转换为双精度,因为双精度是更大的数据类型。它被称为隐式转换。
这个函数调用g()
可以转到f(C c)
,也可以转到f(A a)
。
相关文章:
- 通过 C++ 中的重载构造函数初始化未知类型的变量
- C++将带有重载构造函数的对象添加到另一个对象
- 将重载构造函数传递给类之间的函数
- 使用重载构造函数时出现不完整的类型错误
- 在 if 语句中调用重载构造函数失败
- C++ 具有常量数组和initializer_list的重载构造函数
- C++头/实现文件中的默认和重载构造函数?
- 有没有办法用 2D 数组 (int) 重载构造函数?
- C++重载构造函数问题
- C++:使用结构或枚举重载构造函数之间的区别
- 未调用模板成员的重载构造函数
- 如果我们在c++中重载构造函数,那么默认构造函数是否仍然存在
- 如何为显式重载构造函数启用复制初始化
- 执行重载构造函数的原因和时间
- c++ 在对象组合上使用重载构造函数
- 按参数C++类型专门化重载构造函数
- 具有公共重载构造函数的私有枚举
- 如何处理默认构造函数和重载构造函数之间的歧义
- 变量不会在重载构造函数C++后保持声明状态
- 对重载构造函数 C++ 的不明确调用