隐含地投奔布尔?

时间:2014-04-16 05:26:22

标签: gcc c++11 casting implicit

我的代码遇到了这个奇怪的问题,似乎编译器隐式地将我的参数转换为另一种类型。但是,当我将构造函数标记为显式时,它似乎无法解决问题。

我在单元测试中有这个

JsonValue stringItem("test");
CHECK(stringItem.type() == JsonValue::Type::String);

结果失败

4 == 3

这些是构造函数的样子......

JsonValue::JsonValue()
 : mType(Type::Null) {
}

JsonValue::JsonValue(bool ab)
 : mType(Type::Boolean) {
    mData.b = ab;
}

JsonValue::JsonValue(int ai)
 : mType(Type::Int) {
    mData.i = ai;
}

JsonValue::JsonValue(std::uint32_t aui)
 : mType(Type::UnsignedInt) {
    mData.ui = aui;
}

// It should be using this constructory
// but mType is not getting set to Type::String
JsonValue::JsonValue(const std::string &astr)
 : mType(Type::String) {
    mData.str = new std::string(astr);
}

正如我之前提到的,将JsonValue(bool)标记为explicit并未解决问题。我还编译-Wconversion没有警告

Enum看起来像这样

enum Type {
            Null = 0,
            Object,
            Array,
            String,
            Boolean,
            Int,
            UnsignedInt
         };

1 个答案:

答案 0 :(得分:2)

您需要明确构造函数的参数:

JsonValue stringItem(std::string("test"));

正在发生的是您正在从const char*bool进行隐式转换,因为这是内置类型之间的转换,而且比{{1}转换更好} const char*,这是一个涉及内置类型的转换。

或者,您可以添加一个带std::string的构造函数并在内部存储字符串。这是一个更好的选择,因为它避免了您遇到的容易出错:

const char*

请注意,表面上似乎没有理由存储动态分配的字符串。这可能会增加不必要的复杂性。