为什么转换涉及两个用户定义的转换功能/构造函数
Why conversion can involve two user defined conversion function/constructor?
我试图理解标准中的哪个规则在下面证明了编译器行为的合理性。因此,此问题仅旨在获得语言律师答案。
让我们考虑一下这两个类:
struct A{
A(int);
};
struct B{
operator int();
};
以下代码编译:
B b;
A a{b};
变量a
由b
直接初始化。根据[dlc.init]/17.6.3:
否则(即,对于剩余的副本限制案例(,用户定义的转换序列可以从源类型转换为目标类型,或者(当使用转换功能时(转换为派生类别,如所述在[over.match.copy]中,
我了解,直接初始化的过程将列出所有用户定义转换序列,该序列可以执行从B
(源类型(转换为目标类型A
。[Over.Match.Copy]说明在哪里可以找到用户定义的转换功能。
a 用户定义的转换序列只能涉及1个用户定义的转换功能或构造函数。但是,唯一的转换路径包括调用转换构造函数A::A(int)
和转换函数B::operator int()
。
因此,没有用户定义的转换序列可以从B
转换为A
。
为什么根据标准可以很好地形成初始化A a{b};
?
它的形式很好,因为它使用一种转换从B转换为int
。然后使用该int
作为参数。
这将是您有两个用户定义转换的情况:
void f( A a ) {}
B b;
f( b );
相关文章:
- Visual C++(VS2017)中用户定义的转换不明确
- 变量定义到C++布尔值转换
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 参数包构造函数在类模板中隐藏用户定义的转换
- C++:用户定义的显式类型转换函数错误
- 如何定义在用作函数参数时工作的类模板的转换
- 为什么转换函数声明不需要至少一个定义类型说明符
- 将文件复制到自定义位置,存在字符串转换问题
- 为什么从 char 转换为 std::byte 可能是未定义的行为?
- C++ 通过自定义赋值运算符隐式转换函数参数
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 用户定义的转换不能在C++中使用static_cast
- 用户定义的转换无法指定返回类型
- 如何在参数中定义隐式类型转换的构造函数?
- 是否可以创建一个用户定义的文本,将字符串文本转换为 own 类型的数组?
- 将结构 std::memcpy 转换为具有足够容量的 std::vector 是未定义的行为<char>吗?
- 在 C++ 中,我可以在不修改类的情况下定义对类的隐式转换吗?
- 过载分辨率和用户定义的转换
- 如何定义 typedefs 的隐式转换?
- 在unordered_map中,C2440"类型转换":无法转换...定义运算符 == 和hash_value时