我正在尝试使用boost :: variant,并且我正在使用它的方式遇到一些问题。我希望有人可以对这种情况有所了解。
我创建了一个boost :: variant,并使用int
和unsigned 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;
}
答案 0 :(得分:2)
数字文字的类型是not ambiguous,并且在很大程度上可以隐式转换。简而言之,4
是int
,4U
是unsigned int
。除非你的编译器对这些事情有特定的警告,否则你不太可能会发出警告。
答案 1 :(得分:0)
根据Michael Urman的回应,我想更完整地填写这个答案。
C ++标准规定了以下内容(2.14.2.2):
整数文字的类型是表6中第一个可以表示其值的列表。
表6列出了整数文字的粗略顺序,int,unsigned int,long int,unsigned long int,... etc
基于以上所述,这就是编译器为boost :: variant赋予int类型的原因。