这个问题可能被认为是理论上的,因为我不明白为什么在实际代码中会有这样的设计。我有两个带有一些转换运算符的类:
class B;
class A {
public:
A() = default;
A(B const &);
};
class B {
public:
B() = default;
operator A();
};
A::A(B const &) {};
B::operator A() { return A{}; };
int main() {
[[maybe_unused]] A ad{B{}}; // direct init
[[maybe_unused]] A ac = B{}; // copy init
}
仅使用 gcc 并且仅使用复制初始化我收到此警告:
警告:选择“B::operator A()”而不是“A::A(const B&)”[-Wconversion]
警告:从“B”到“A”的转换 [-Wconversion]
注意:因为参数的转换顺序更好
由于不熟悉转换规则,我不明白这个警告是否相关?如果不相关,如何才能让它保持沉默(这可能会很痛苦-Werror
)?
NB:添加一些跟踪后,我观察到根据编译器和初始化性质的不同行为。转换序列是否在某种程度上依赖于实现?