草庐IT

c++ - 模板化上下文中的显式析构函数

我想在模板上下文中显式销毁一个vector。以下适用于我(GNUC++4.3、4.4和Clang++1.1):templatevoiddestroy_vector_owner(VectorOwner*obj){obj->v.~vector();//furthercleanupbyPythonAPIfunctionsomitted}虽然它在MacOSXv10.5的g++(i686-apple-darwin10-gcc-4.2.1)上失败了expectedclass-namebefore‘(’token如果我把它改成obj->v.~vector();代码无法用G++编译,但Clang仍然可

c++ - 显式构造函数和嵌套初始化列表

下面的代码可以用大多数现代C++11兼容编译器(GCC>=5.x、Clang、ICC、MSVC)成功编译。#includestructA{explicitA(constchar*){}A(std::string){}};structB{B(A){}B(B&)=delete;};intmain(void){Bb1({{{"test"}}});}但是为什么首先要编译它,列出的编译器如何解释该代码?为什么MSVC能够在没有B(B&)=delete;的情况下编译这个,但是其他3个编译器都需要吗?以及为什么当我删除时它在除MSVC之外的所有编译器中都失败不同的签名复制构造函数,例如B(const

c++ - 共享库中模板化类和 dynamic_cast 的显式实例化

今天我遇到了一个我似乎无法解决的问题。我正在编译一个共享库,其中包含一个模板化类(Derived,其基础是Base)和此类的一些显式实例化。我希望图书馆用户从这个模板化类中扩展。当我尝试dynamic_cast时出现问题来自Base*的用户实例至Derived*.我已经将问题缩小到这个MWE:共享库包含以下文件:Base.h#ifndefBASE_H_#defineBASE_H_classBase{public:Base();virtual~Base();};#endif/*BASE_H_*/Derived.h#ifndefDERIVED_H_#defineDERIVED_H_#inc

c++ - MSVC 中的模板静态定义和显式特化实例化错误

我想知道为什么下面的代码在gcc中运行得很好#includeusingnamespacestd;templatestructF{staticTconstvalue;};templatestructF{//Specializationstaticintconstvalue;};templatestructF;templateTconstF::value=sizeof(T);templateintconstF::value=42;intmain(){structFma;couthttp://ideone.com/wvrurz在MSVC2012上我无法编译它:#includeusingnam

c++ - C++1 7's deduced ` auto` 非类型 `template` 参数是否可以使用显式非类型参数模式匹配模板?

考虑这个例子(alsoavailableonwandbox):templateclass>voidtest(){}templatestructX{};正在尝试实例化test()在clang++4.0(trunk)导致编译错误:error:nomatchingfunctionforcallto'test'test();^~~~~~~note:candidatetemplateignored:invalidexplicitly-specifiedargumentfor1sttemplateparametervoidtest(){}我最初的假设/直觉是test可用于匹配任何template具

c++ - 我们是否需要显式调用分配给 "simple POD classes"的 "placement new"的析构函数?

这里的“简单”是指具有非虚空析构函数或POD类型的类。典型例子:charbuffer[SIZE];T*p=new(buffer)T;...p->~T();//如果我们不在p上调用显式析构函数会怎样?我不认为这是未定义的行为或内存泄漏。重用buffer有什么问题吗? 最佳答案 从技术上讲,假设析构函数不释放在构造期间获取的任何资源,则可能没有必要。但是,考虑到非技术方面——代码的维护和演进——我会坚持最佳实践——构建的东西应该被破坏。要考虑的场景-如果将来某些更改将确定要放入析构函数中的相关代码怎么办?你会记得你怀疑过那种类型的对象的

c++ - 2.0 和 2.0f 之间的区别(显式 float 与 double 文字)

我对将f放在文字值旁边有一些疑问。我知道它将它定义为float但我真的需要它吗?此2.0f*2.0f是否比2.0*2.0更快或编译有任何不同?像floata=2.0;这样的语句的编译方式是否与floata=2.0f;不同? 最佳答案 有时您需要它显式地具有float类型,如下例所示floatf=...;floatr=std::max(f,42.0);//won'twork;(float,double).floatr=std::max(f,42.0f);//works:bothhavesametype

c++ - C++显式转换真的那么糟糕吗?

此时我对C++的了解比其他任何知识都更学术。在我迄今为止的所有阅读中,显式转换与命名转换的使用(const_cast、static_cast、reinterpret_cast、dynamic_cast)带有一个很大的警告标签(很容易看出原因),暗示显式转换是不良设计的症状,只能在绝望的情况下作为最后的手段使用。所以,我不得不问:使用命名强制转换的显式转换真的只是陪审团操纵代码,还是对此功能有更优雅和积极的应用?后者有一个很好的例子吗? 最佳答案 有些情况下您离不开它。喜欢thisone.问题是你有多重继承,需要将this指针转换为v

c++ - 为什么在返回兼容类型时需要显式 std::move?

我正在看STL的“Don’tHelptheCompiler”演讲,他在幻灯片26上有一个类似的例子:structA{A()=default;A(constA&){std::coutget_pair(){std::pairp;returnp;}std::tupleget_tuple(){std::pairp;returnp;}std::tupleget_tuple_moved(){std::pairp;returnstd::move(p);}有了这个,下面的调用:get_pair();get_tuple();get_tuple_moved();产生这个输出:movedmovedcopie

c++ - Visual C++ - 显式调用基本类型的转换运算符

我正在研究一个Foo类,它定义了一个隐式的operatorbool()。我使用Foo作为几个函数的返回类型,所以我可以获得有关已完成的操作的信息并调用Foo::operatorbool()来获取是否操作已成功执行。出于好奇,我还尝试在使用Foo时显式调用转换运算符:if(!func().operatorbool())//funcreturnedFoothrowstd::logic_error("operationwasnotsuccessful");效果很好。然后,我突然决定转储Foo类并使用简单的bool但我忘了删除.operatorbool()函数调用返回值。因此我发现了一组Vis