草庐IT

c++ - VC是否符合警告C4407的标准?

以下源代码在VC中生成警告C4407,编译器确实生成了不正确的代码。structA1{inta1;};structA2{inta2;};structB:A1,A2{voidf(){std::cout*pb)();(pA->*pa)();}产生的代码不正确,因为在调用pa时没有调整指针pA,导致中的this指针值错误f。但是,代码在GCC和clang中编译良好,没有任何警告(严格别名除外)。指针pA在GCC和clang生成的代码中进行了适当的调整。所以,我想知道标准对此有何看法?上面代码中的转换是否符合标准?或者它是GCC和clang的非标准扩展? 最佳答案

python - 将 Cython 融合类型转换为 C++ 指针

这是一个关于从Cython融合类型转换为C++类型的一般性问题,我将用一个最小的例子来描述。考虑肤浅的C++函数模板:templatevoidscale_impl(constT*x,T*y,constTa,constsize_tN){for(size_tn=0;n我希望能够在任何numpyndarray上调用这个函数任何类型和形状。使用Cython,我们首先声明函数模板:cdefextern:voidscale_impl[T](constT*x,T*y,constTa,constsize_tN)然后声明我们希望操作的有效标量类型:ctypedeffusedScalar:floatdou

C++ 转换为基类

这个问题在这里已经有了答案:Whatisobjectslicing?(18个答案)关闭5年前。我有一个基类A和一个派生类B。classA{public:intx;virtualintgetX(){returnx;}};classB:publicA{public:inty;};虚函数只是为了让它多态。接下来我声明一个A的列表,但将B放在里面:vectorlist;Bb1,b2;b1.y=2;b2.x=10;list.push_back(b1);list.push_back(b2);现在我想遍历vector上的所有元素并访问y成员(只有B有):for(autoit=list.begin()

c++ - GTK+ 对多个小部件使用一个处理程序

我有一个回调函数如下:voidhandle(GtkWidget*widget,gpointerdata){...}因为这个窗口有很多小部件,所以我想使用这个回调作为唯一的处理程序,以避免编写一堆小函数。最初我想使用一个存储在环绕窗口的UI类中的枚举,然后我将按如下方式对其进行测试:UIClass::Signalsignal=(UIClass::Signal)data;switch(signal){caseUIClass::main_button://handlecaseUIClass::check_box:...}但是编译器拒绝在该片段的第一行进行强制转换。有没有标准的方法来完成这个?

c++ - 将指针转换为指针引用会导致未定义的行为吗?

我遇到了以下丑陋的代码,想知道标准对此有何规定。调用foo()是否被认为会导致未定义的行为?或者它是无害的?#includeclassBase{};classDerived:publicBase{};voidfoo(Base*&b){std::cout我相信丑陋的c-cast已经完成,因为简单的(Base*)cast会导致编译错误。即便如此,它现在编译是否只是因为严格的别名?还是标准允许转换为引用? 最佳答案 这是相当UB,因为您有效地重新解释派生指针作为基指针。原因是您没有将Derived指针转换为Base指针,而是将T&转换为U

c++ - 我可以逆转数组到指针衰减的过程吗?

将指向数组第一个元素的指针转换为指向整个数组的指针是否合法?templatevoidwhatever(T(&)[N]){std::cout这会在我的编译器上打印10,但我不确定C++标准是否允许它。 最佳答案 不,这是不合法的(因为它是未定义的行为)。指向整个数组的指针是&a而不是p。基本上,您是在将一个指针指向另一个指针。该标准描述了所有允许的转换,而这个不在其中。 关于c++-我可以逆转数组到指针衰减的过程吗?,我们在StackOverflow上找到一个类似的问题:

c++ - 什么时候必须/应该使用 dynamic_cast 而不是 static_cast?

我想知道什么时候dynamic_cast必须或应该在static_cast上使用,并提供示例。我读过thisSOquestion,但它并没有真正提供任何具体的例子。我假设大多数示例都涉及多态类类型。目前我知道在static_cast上使用dynamic_cast的唯一原因是我不能100%确定我正在使用的具体类型。一些其他的想法:横向转换(在多重继承中)在虚拟继承层次结构中转换为基类在使用多重继承的类中转换到“最右边”的继承类型时,指针会改变(如果使用static_cast)吗?“如果类型未知”是唯一的原因吗?如果不是,有人可以提供示例来说明为什么必须或应该使用dynamic_cast而

c++ - 编织内联类型转换(python)

2013年最美好的祝愿!我正在使用SciPy的编织与我的一些C++代码内联来转置巨大的矩阵(大约200.000x15)。它就像一个魅力,但我有一个关于类型转换的问题:我的输入矩阵是从文件中读取的,以逗号分隔等等,所以所有的条目都是字符串而不是float('0.551'而不是0.551)。这不会影响转置函数的工作方式,但后来我不得不将某些行转换为numpyfloat数组,所以我想知道是否可以在C++代码中完成。让我用一些代码来解释:deftranspose(lines,N,x):code="""py::listmatrix;for(inti=0;i在示例中,我的小矩阵将被转置,我的示例结

c++ - 在断言中检查 static_cast 与 reinterpret_cast

我看到了一些代码ASSERT(static_cast(p)==reinterpret_cast(p))我认为p是一个基类型指针。这个断言的目的是什么?它是否检查MyClass不是某些多重继承层次结构的一部分(或任何会导致已知强制转换更改p的地址值的东西)? 最佳答案 由于reinterpret_cast(p)的行为是大多数用途的特定实现,几乎所有reinterpret_cast(p)的用途是代码高度不可移植且理想情况下应避免的标志。有时reinterpret_casts是不可避免的,但尝试断言它的属性几乎肯定是代码正在尝试做它不应该

c++类型转换运算符重载和隐式转换

如果我正在重载类型转换运算符,当需要隐式转换但找不到时,我会遇到编译错误。考虑一个简单的示例,其中我有一个包含类型(在本例中为longlong)的包装类:classmy_wrapper{longlongstate;public:my_wrapper(longlong_in):state(_in){}my_wrapper&operator=(constlonglongrhs){state=rhs;return*this;}operatorlonglong(){returnstate;}};现在的问题是,如果我想将代码转换为其他内容(例如void*...假设我为此使用64位),则如果不指定