问题是Variant
提供了太多的转换运算符。特别是,以下运算符使转换为 bool 不明确:
__fastcall operator bool() const;
__fastcall operator signed char*();
__fastcall operator unsigned char*();
// etc. - Variant has similar operators for short, int, long, float, double...
// It calls these "by ref" conversions.
据我了解,非 const 重载通常比 const 重载更受欢迎,但是对于非 const 可转换到布尔指针转换以及 const bool 转换的 >1 替代方案,转换是模棱两可的。
将其转换设计为不能毫无歧义地使用它们可能是一个错误Variant
,但在@user2672165 和@Remy Lebeau 的评论的帮助下,有几种解决方法:
// Convert to int instead of bool.
if ((int)GetPropValue(c, "Enabled", false)) {}
// Make the Variant const, to avoid the ambiguous non-const conversions.
if (const_cast<const Variant>(GetPropValue(c, "Enabled", false))) {}
// Explicitly invoke the desired conversion operator.
if (GetPropValue(CheckBox1, "Enabled", false).operator bool()) {}
// Use TRttiProperty instead of Variant.
RttiContext ctx;
if (ctx.GetType(c->ClassType())->GetProperty("Enabled")->GetValue(c).AsBoolean()) {}