Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
支持类型转换的数字文本 P.在C和C++中,不同的数字文字有不同的类型。例如: 0属于int类型 0u的类型为无符号int 0.0属于double类型 0.0f属于float类型 等等_C++ - Fatal编程技术网

支持类型转换的数字文本 P.在C和C++中,不同的数字文字有不同的类型。例如: 0属于int类型 0u的类型为无符号int 0.0属于double类型 0.0f属于float类型 等等

支持类型转换的数字文本 P.在C和C++中,不同的数字文字有不同的类型。例如: 0属于int类型 0u的类型为无符号int 0.0属于double类型 0.0f属于float类型 等等,c++,C++,因此,如果使用文本值初始化变量,则该文本的类型必须与该变量的类型相同,否则将进行类型转换以执行分配: int i = 0.0; 这看起来像是一个愚蠢的转换,而且因为文本的值在编译时是已知的,编译器可以很容易地避免这种转换,只需以正确的格式分配值(在本例中是有符号整数而不是浮点) 我的问题很简单:是否保证任何合适的(或者至少是任何现代编译器,我正在使用GCC4.8.2)都可以避免这种转换? 我正在为代数编写几个泛型类,我担心使用文本进行初始化,如下所示: template<typename

因此,如果使用文本值初始化变量,则该文本的类型必须与该变量的类型相同,否则将进行类型转换以执行分配:

int i = 0.0;
这看起来像是一个愚蠢的转换,而且因为文本的值在编译时是已知的,编译器可以很容易地避免这种转换,只需以正确的格式分配值(在本例中是有符号整数而不是浮点)

我的问题很简单:是否保证任何合适的(或者至少是任何现代编译器,我正在使用GCC4.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 ) {}
};
模板
结构向量
{
tx,y;
向量_2d(txx,tyy):x(xx),y(yy){
//如下所示的初始化:
vector_2d():vector_2d(0,0){}
};

因为我不知道哪个类型是
t
,所以当类型是
float
时,我不能使用
0.0f
,以此类推。当然,我不会编写模板专门化来捕获不同类型的参数:P

您可以使用值初始化来获得适当类型的“零”值

vector_2d() : vector_2d( T() , T() ) {}

当然,这只适用于零。对于其他值,您需要Nikolay评论的
constexpr
函数模板

template<typename TResult, typename TFrom>
constexpr TResult compiletime_conversion(const TFrom val)
{
    TResult result = val;
    return result;
}
模板
constexpr TResult compiletime_转换(const TFrom val)
{
TResult result=val;
返回结果;
}

它不是“保证”的,但任何现代优化编译器都会在不违反标准的情况下尽可能多地进行转换省略。这取决于“保证”的含义-标准不要求它,所以我猜字面上的答案是“不”@内:在一个内部循环中(我相信像
vector\u2d
这样的类很可能是),这可能是非常重要的。在C++11中,可以使用模板来确保在编译时执行转换。紫龙书在其第一个优化示例中有这种优化,所以您可以放心:)成员初始化只是一个示例,而且我不仅仅是在谈论零初始化。但是对于零,这当然更好。你能提供一个
constexpr
函数的例子吗?我了解并理解了这个想法,但我更喜欢先看一个例子(这对以后看这篇文章的人来说更好)。谢谢。@Manu343726:有一个例子。看起来像是
static\u cast
只要使用
static\u cast
:)Thanks@Manu:不,不是。转换顺序在编译时确定,但值的实际转换可能在运行时进行(毕竟,在运行时之前可能不知道值)。
constexpr
函数也是如此,但这些函数专门用于编译时计算,因此编译器强烈要求这样做。
template<typename TResult, typename TFrom>
constexpr TResult compiletime_conversion(const TFrom val)
{
    TResult result = val;
    return result;
}