草庐IT

c++ - 获取变量类型

如果我没理解错的话,在多态中typeid可以确定实际的类型,而typeof则不能。他们的return是不是也有不同的用途:typeof的return作为type关键字可以定义变量,而typeid的return不可以?有没有办法既获取多态性的实际类型又使用returnastype关键字来定义另一个变量?我希望从一个指向基类的指针得到派生类的类型,并定义一个派生类的变量或指针。像这样的东西:baseclass*p=newderivedclasstypexxx(*p)*pp=dynamic_cast(p);//wouldliketoconvertthepointerfrompointingt

c++ - 为什么 void 在 C++ 中不采用 void 值?

我很好奇为什么C++不通过:定义voidtypedefstruct{}void;即无法实例化的类型的值是什么,即使该安装必须不产生代码?如果我们使用gcc-O3-S,那么以下两个都会产生相同的汇编程序:intmain(){return0;}和templateTf(Ta){}typedefstruct{}moo;intmain(){mooa;f(a);return0;}这很有道理。struct{}只需要一个空值,很容易优化掉。事实上,奇怪的是它们在没有-O3的情况下生成不同的代码。但是,您不能简单地使用typedefvoidmoo来实现同样的技巧,因为void不能假定任何值,甚至不能是空

c++ - 模板类中的模板函数 is_same

为什么这段代码会产生错误的输出?//this-type.cpp#include#includeusingnamespacestd;templateclassA{public:A(){cout>::value{};intmain(){Bb;}输出:$g++-std=c++11this-type.cpp$./a.outfalseA到B中的“*this”的类型是A,不是吗? 最佳答案 *this是A类型的左值,因此decltype(*this)将给出引用类型A&。回想一下左值上的decltype给出了引用类型:cout>::value&>

C++ : Check if the template type is one of the variadic template types

这个问题在这里已经有了答案:Checkifatypeispassedinvariadictemplateparameterpack(3个答案)关闭7年前。假设我们有函数:templatevoidfoo(){...};检查“Kind”类型是否是C++(包括C++1z)中的“Kinds”类型之一的最简单方法是什么?

c++ - 转化和推广是一回事吗?

我不确定提升是否仅仅意味着将数据类型转换为更大的数据类型(例如short到int)。或者提升是否意味着将数据类型转换为另一种“兼容”数据类型,例如将short转换为int,这将保持相同的位模式(额外的空间将用零填充)。转换是否意味着将int之类的东西转换为float,这将创建一个完全不同的位模式? 最佳答案 有两种东西叫促销:积分促销和浮点促销。整数提升是指整数类型(包括位域和枚举)被转换为“更大”的整数类型,而浮点提升具体只是float到double。这两种类型的促销都是更广泛转化的子集。char->int:积分提升float->

c++ - C++ 字符串文字的类型

出于好奇,我想知道C++字符串文字的真正底层类型是什么。根据我的观察,我会得到不同的结果。像下面这样的typeid测试:std::cout显示charconst[5]。像这样尝试将字符串文字分配给不兼容的类型(以查看给定的错误):wchar_t*s="hello";我从VS12的IntelliSense得到类型为“constchar*”的值不能用于初始化类型为“wchar_t*”的实体。但我不明白它怎么可能是constchar*,因为VS12接受了以下行:char*s="Hello";我读到这在C++11之前的标准中是允许的,因为它是为了与C的追溯兼容性,尽管修改s会导致未定义的行为。

c++ - 指针参数和数组参数有区别吗?

void方法(double*v)void方法(doublev[5])这两者有什么区别吗?第二个是否更具体,如v中的长度被限制为5个元素? 最佳答案 当声明为参数类型时,数组会退化为指针类型。在你的例子中,voidmethod(doublev[5]);这里5根本没有任何作用,它是如此的微不足道以至于你可以完全省略它,而是写成这个:voidmethod(doublev[]);这与前面的声明完全相同。由于衰减成指针,所以上面两个完全一样:voidmethod(double*v);//becausearraydecaystopointer,

c++ - 使用和何时使用 int16_t、int32_t、int64_t 和分别为 short int、int、long int、long

使用和何时使用int16_t、int32_t、int64_t以及分别使用short、int,长。C++中有太多该死的类型。对于整数,什么时候使用一个而不是另一个是正确的? 最佳答案 当精度很重要时,使用明确定义的类型。当它不是时,使用不太确定的。使用更精确的永远不会错。当您使用灵活的时,有时会导致错误。 关于c++-使用和何时使用int16_t、int32_t、int64_t和分别为shortint、int、longint、long,我们在StackOverflow上找到一个类似的问题:

c++ - 长整数和 float

如果长整数和float都需要4个字节存储在内存中,那么为什么它们的范围不同? 最佳答案 整数是这样存储的:1位用于符号(+/-)31位的值。float的存储方式不同,以牺牲准确性为代价提供更大的范围:1位用于符号(+/-)尾数S的N位指数E的M位float以指数形式表示:(+/-)S*(base)^E顺便说一句,“长”并不总是32位。参见thisarticle. 关于c++-长整数和float,我们在StackOverflow上找到一个类似的问题: https

c++ - 为什么 C++ 库经常定义自己的原始类型?

我最近开始使用OpenCL库,我注意到它们使用自己的整数类型,例如cl_int和cl_uint,而不是int和unsignedint。这是为什么呢?他们为什么不使用语言中默认的类型?这是一个好的做法还是有实际原因(即更易读的代码)? 最佳答案 过去这样做的原因是可移植性。C和C++不对int、long和short的大小做出具体保证,而库设计者通常需要它。一个常见的解决方案是为数据类型定义自己的别名,并根据特定平台更改定义,确保使用适当大小的类型。此问题起源于C,并已通过引入stdint.h头文件(在C++中重命名为cstdint)得