static-cast相关内容
静态强制转换的说明为 如果new_type是右值引用类型,则STATIC_CAST将表达式的值转换为x值。此类型的STATIC_CAST用于在STD::Move中实现移动语义。(从C++11开始) 这是否确认以下内容是等价的? (A) X x1; X x2 = static_cast(x1); (B) X x1; X x2 = std::move(x1
..
显然编译器认为它们是不相关的类型,因此需要 reinterpret_cast.为什么会有这样的规定? 解决方案 它们是完全不同的类型,见标准: 3.9.1 基本类型 [basic.fundamental] 1 声明为字符 char) 的对象应足够大存储实现的基本字符集的任何成员.如果一个该集合中的字符存储在字符对象中,积分该字符对象的值等于单个的值该字符的字符文字形式.它是实现
..
所以我问了这个问题,我想通过static_cast解决它.(顺便说一句,它确实解决了问题,我只是不确定我是否理解原因.) 在代码中: vectorfoo = {0, 42, 0, 42, 0, 42};replace(begin(foo), end(foo), static_cast(foo.front()), 13); static_cast 是否只是构造了一个 R 值 int?那和只
..
考虑到以下代码(和VirtualAlloc() 返回一个 void*): BYTE* pbNext = reinterpret_cast(VirtualAlloc(NULL, cbAlloc, MEM_COMMIT, PAGE_READWRITE)); 为什么选择 reinterpret_cast 而不是 static_cast? 我曾经认为 reinterpret_cast 可以用于例
..
我有三个班级: class A {};B 类:虚拟公共 A {};C 类:虚拟公共 A {};D类:公共B,公共C{}; 尝试从 A* 静态转换到 B* 我收到以下错误: 不能通过虚基A从基A转换为派生类型B 解决方案 为了理解强制转换系统,您需要深入研究对象模型. 简单层次模型的经典表示是包含:如果 B 派生自 A 那么 B 对象实际上将包含一个 A 子对象以及它自己的属性.
..
首先,这不是 为什么我们要在 C++ 中使用 reinterpret_cast,而两个链接的 static_cast 可以完成它的工作?. 我知道我们甚至不能使用两个链接的 static_cast 来实现这一点的情况,reinterpret_cast 可以做什么.但是在任何情况下,我应该更喜欢两个链接的 static_cast 而不是简单且更具可读性的 reinterpret_cast?
..
假设我想将 A* 转换为 char* 反之亦然,我们有两个选择(我的意思是,我们中的许多人认为我们有两个选择,因为两者似乎都有效!因此混乱!): 结构体A{年龄;字符名称[128];};一个;char *buffer = static_cast(static_cast(&a));//选择1char *buffer = reinterpret_cast(&a);//选择2 两者都工作正常. /
..
是否有任何理由更喜欢 static_cast 而不是 C 风格的转换?它们是等价的吗?有什么速度差异吗? 解决方案 C++ 样式转换由编译器检查.C 样式转换不是,并且可能在运行时失败. 另外,c++ 风格的转换很容易搜索,而 c 风格的转换真的很难搜索. 另一个很大的好处是 4 种不同的 C++ 样式转换更清楚地表达了程序员的意图. 在编写 C++ 时,我几乎总是使
..
什么是implicit_cast?我什么时候应该更喜欢implicit_cast而不是static_cast? 解决方案 我正在复制我对 在另一个地方回答此评论. 您可以使用 static_cast 进行向下转换.implicit_cast 并非如此.static_cast 基本上允许您进行任何隐式转换,以及任何隐式转换的反向操作(达到某些限制.如果涉及虚拟基类,则不能向下转换).但
..
static_cast 和 reinterpret_cast 似乎都可以很好地将 void* 转换为另一种指针类型.是否有充分的理由偏爱其中一个? 解决方案 使用 static_cast:它是最窄的强制转换,准确地描述了此处进行的转换.> 有一种误解,认为使用 reinterpret_cast 会更好,因为它意味着“完全忽略类型安全,只是从 A 转换到 B". 然而,这实际上并没有
..
我听说 static_cast 函数应该比 C 风格或简单函数风格的转换更受欢迎.这是真的?为什么? 解决方案 主要的原因是经典的 C 强制转换没有区分我们所说的 static_cast(), reinterpret_cast()、const_cast() 和 dynamic_cast().这四件事完全不同. static_cast() 通常是安全的.语言中有一个有效的转换,
..
我有一个指针 T * pValues,我想将其视为 T (&values)[N] 在这个 SO 答案 https://stackoverflow.com/a/2634994/239916 中,建议的做法这是 T (&values)[N] = *static_cast(static_cast(pValues)); 我对此的担忧是.在他的例子中,pValues 的初始化方式如下 T the
..
可以将双精度数组转换为双精度结构吗? 结构体A{双x;双y;双z;};int main (int argc, char ** argv){双 arr[3] = {1.0,2.0,3.0};A* a = static_cast(static_cast(arr));std::cout
..
由此(RTTI 有多贵?),似乎很明显动态转换是比静态类型比较昂贵得多,但我想知道在编译器选项(VS2010,/GR-)中关闭 RTTI 选项是否值得 我的代码中没有动态转换(我用静态转换替换了它们).但是 (/GR-) 选项在使用动态转换时除了发出错误之外还有其他作用吗?里面有没有内存或代码优化? 提前致谢. 解决方案 Straight 来自MSDN(强调我的): 当/
..
我有一组自定义类 Student 对象.CourseStudent 和 ResearchStudent 都继承自 Student,Student 的所有实例都是其中之一. 我有一个函数来遍历数组,确定每个学生的子类型,然后对它们调用特定于子类型的成员函数. 问题是,因为这些函数没有重载,所以在Student中找不到,所以编译器大惊小怪. 如果我有一个指向 Student 的指针,
..
这是我的代码 enum Status {IN, OUT };const int TITLE_SIZE = 50,ISBN_SIZE = 13,AUTHOR_SIZE = 25;结构信息{字符标题[TITLE_SIZE];char isbn[ISBN_SIZE];字符作者[AUTHOR_SIZE];状态输入或输出;};int main(){fstream 数据文件;字符串文件名;int numOf
..
我有两个功能: void DoSomething( const tchar* apsValue )void DoSomething( size_t aiValue ) 现在我想将 '0' 作为 size_t 传递: DoSomething(0); 编译器抛出错误:“对重载函数的调用不明确" 为了解决这个问题,我可以使用 static_cast,例如: DoSomething(sta
..
为什么“交叉投射"不起作用? 以下创建此对象继承模型: 食物/\芝士蛋糕 这里我尝试将 static_cast 指针从 cheese 指向 cake,制作一个芝士蛋糕 :D.我从 Apple Clang/LLVM 收到以下错误: 错误:不允许从 'Cheese *' 到 'Cake *' 的静态转换,这与继承无关 但他们是通过继承联系起来的:他们是兄弟姐妹. 为什么我不能将
..
对于以下代码,除最后一个断言外,所有消息均通过: templateconstexpr void assert_static_cast_identity(){使用T_cast = decltype(static_cast())));static_assert(std :: is_same_v);}int
..
按照Scott Meyers的说法,为防止getter的const版本和getter的非const版本中的代码重复出现,请从非const版本中调用方法的const版本: static_cast(* this).Methodology(); 然而,由于我输入的Visual Assist X Intellisense过于狂热,导致意外使用: const_cast
..