据我所知,不同的数字文字在C和C ++中有不同的类型。例如:
0
的类型为int
。 0u
的类型为unsigned int
。 0.0
的类型为double
。 0.0f
的类型为float
等因此,如果使用文字值初始化变量,则该文字的类型必须与变量相同,否则执行类型转换以执行分配:
int i = 0.0;
这似乎是一个愚蠢的转换,并且因为在编译时知道文字的值,编译器可以轻松地避免该转换,只需以正确的格式(有符号整数而不是浮点数)分配值。这个例子)。
我的问题非常简单:保证任何体面的(或至少任何现代编译器,我使用的是GCC 4.8.2)都会忽略转换?
我正在为代数编写几个泛型类,我担心使用文字进行初始化,如下所示:
template<typename T>
struct vector_2d
{
T x , y;
vector_2d( T xx , T yy ) : x( xx ) , y( yy ) {}
//Initializations like this:
vector_2d() : vector_2d( 0 , 0 ) {}
};
因为我不知道哪种类型是T
,所以当类型为0.0f
时我无法使用float
,依此类推。当然,我不会编写模板特化来捕获不同类型的参数:P
答案 0 :(得分:3)
您可以使用值初始化来获得相应类型的“零”值。
vector_2d() : vector_2d( T() , T() ) {}
或
vector_2d() : x(), y() {}
当然,这只适用于零。对于其他值,您可能需要{Nikisy评论的constexpr
函数模板。
template<typename TResult, typename TFrom>
constexpr TResult compiletime_conversion(const TFrom val)
{
TResult result = val;
return result;
}