如何防止使用多种类型的整数隐式转换为boost :: variant类型?

时间:2014-05-15 19:58:40

标签: c++ templates boost

我正在尝试使用boost :: variant,并且我正在使用它的方式遇到一些问题。我希望有人可以对这种情况有所了解。

我创建了一个boost :: variant,并使用intunsigned int对其进行了模板化。当我为变量分配一个数值(即4)时,我希望编译器会抱怨,因为普通的旧4不能明确地推断出它的类型。这怎么编译?!编译器如何选择类型?

有没有办法让编译器抱怨这些事情?

#include <stdint.h>
#include <boost/variant.hpp>
#include <boost/scoped_ptr.hpp>
#include <cxxabi.h>

struct MyComplexType
{
    int myInt;
    uint32_t myUint;
};

int main()
{
    boost::variant< MyComplexType, int, uint32_t, float, std::string> myAmbiguousVar;

    myAmbiguousVar = 4; // <- ?? My compiler chooses this to be an int

    int status;
    boost::scoped_ptr<char> pDemangled(__cxxabiv1::__cxa_demangle(myAmbiguousVar.type().name(), 0, 0, &status));
    std::cout << std::string(pDemangled.get()) << std::endl;
}

2 个答案:

答案 0 :(得分:2)

数字文字的类型是not ambiguous,并且在很大程度上可以隐式转换。简而言之,4int4Uunsigned int。除非你的编译器对这些事情有特定的警告,否则你不太可能会发出警告。

答案 1 :(得分:0)

根据Michael Urman的回应,我想更完整地填写这个答案。

C ++标准规定了以下内容(2.14.2.2):

  

整数文字的类型是表6中第一个可以表示其值的列表。

表6列出了整数文字的粗略顺序,int,unsigned int,long int,unsigned long int,... etc

基于以上所述,这就是编译器为boost :: variant赋予int类型的原因。