C++ 如何启用从一个类到另一个类的转换?
我想允许从a到B的转换:C++ 如何启用从一个类到另一个类的转换?,c++,C++,我想允许从a到B的转换: A{4}; B=a; 以下是设置: A类 { 公众: 显式A(int值) :成员{value} { } 私人: 国际会员; }; B类:公共A { 公众: 显式B(A) :A{A} { } }; int main() { A A{4}; B=a; } 我可能会删除B的构造函数中的explicit修饰符,但是,Clang Tidy抱怨单参数构造函数必须标记为explicit,以避免无意的隐式转换。 我想要的是从A到B的有意转换,但我不知所措-在A中定义转换运算符似乎很
A{4};
B=a;
以下是设置:
A类
{
公众:
显式A(int值)
:成员{value}
{
}
私人:
国际会员;
};
B类:公共A
{
公众:
显式B(A)
:A{A}
{
}
};
int main()
{
A A{4};
B=a;
}
我可能会删除B
的构造函数中的explicit
修饰符,但是,Clang Tidy抱怨单参数构造函数必须标记为explicit,以避免无意的隐式转换。
我想要的是从A
到B
的有意转换,但我不知所措-在A
中定义转换运算符似乎很奇怪,因为我必须向前声明B及其构造函数,我甚至不知道这是否可能,因为B
继承A
如何启用此转换
ClangTidy抱怨单参数构造函数必须标记为显式,以避免无意的隐式转换
坦率地说,我强烈怀疑这是clang tidy所说的(“必须是”)。未声明为显式的单参数构造函数是。它们可能是邪恶的,因为在某种程度上它们禁用了类型安全性
您可以启用隐式转换,但也将启用所有不需要的隐式转换。考虑一个
void foo(B);
如果没有隐式转换,将A
传递到foo
是一个错误。这是件好事,foo
想要的是B
而不是a
。隐式转换不会被注意到,并且可以隐藏代码中的逻辑错误。这就是为什么单参数构造函数应该声明为显式的,除非您真的希望它们能够实现所有的起伏
TL;DR:ClangTidys的信息只是一个建议。隐式转换没有什么错,只要您知道其后果。考虑如果你想要它,然后忽略Calang-TyDy。< /P> <代码>但是,Clang Tidy抱怨< /Cord> >所以你想让我们告诉你忽略CLAN-TYDY?代码>我想要的是有意的转换然后是显式的-
bb=B(a)代码>这与我想做的恰恰相反。我想告诉编译器,我明确地希望允许从B到A的转换!编译器不在乎。Clang tidy不是编译器。显式
构造函数不使用语言设计的复制初始化(=
)。但是你可以做bb{a}代码>或B(a)
.clangtidy告诉您,允许像这样从一个类隐式转换到另一个类通常不是一个好主意。如果这正是你想要的,请不要理会叮当声。谢谢你的回答!这确实是叮当·蒂迪所说的。问题消息副本:clangtidy:必须将单参数构造函数标记为显式以避免无意的隐式转换
要消除clangtidy建议,可以将函数声明行更改为:B(aa)//NOLINT(谷歌显式构造函数)
@glennib ok,我从来没有用过叮当声,所以我不确定。虽然如果它真的说“必须”,那么我希望在他们的文档中的某个地方,他们提到隐式转换是不允许的,因为事实上,只有叮当声才能使它成为“必须”,而一般来说,它只是一个“应该”