据我所知,在 C 和 C++ 中,不同的数字文字有不同的类型。例如:
0
的类型为int
。0u
的类型为unsigned int
。0.0
的类型为double
。0.0f
的类型为float
。
等等
因此,如果您使用文字值初始化变量,则该文字的类型必须与该变量相同,否则将进行类型转换来执行分配:
int i = 0.0;
这似乎是一个愚蠢的转换,并且因为文字的值在编译时是已知的,所以编译器可以轻松地避免该转换并以正确的格式分配值(有符号整数而不是 float ,在这个例子)。
我的问题很简单:是否保证任何像样的(或者至少是任何现代编译器,我正在使用 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
是哪种类型,所以当类型为float
等时我无法使用0.0f
。当然,我不会编写模板专门化来捕获不同类型的参数:P
最佳答案
您可以使用值初始化来获取适当类型的“零”值。
vector_2d() : vector_2d( T() , T() ) {}
或
vector_2d() : x(), y() {}
当然,这只适用于零。对于其他值,您需要一个 constexpr
函数模板,如 Nikolay 评论的那样。
template<typename TResult, typename TFrom>
constexpr TResult compiletime_conversion(const TFrom val)
{
TResult result = val;
return result;
}
关于c++ - 类型转换感知的数字文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20827736/