草庐IT

具有显式构造函数的不可复制类型的 C++11 数组初始化

我有一个不可复制的(第三方)类。我想初始化它们的数组。这是我最好的尝试:#includeclassThing{public:explicitThing(int){}Thing(constThing&)=delete;};intmain(){std::arraythings{{{100}}};//errorhere};GCC4.7.2说:error:convertingto‘std::array::value_type{akaThing}’frominitializerlistwoulduseexplicitconstructor‘Thing::Thing(int)’好的,但这正是我想要

c++ - Visual Studio 2017 是否需要显式移动构造函数声明?

以下代码可以使用VisualStudio2015成功编译,但使用VisualStudio2017失败。VisualStudio2017报告:errorC2280:“std::pair::pair(conststd::pair&)”:attemptingtoreferenceadeletedfunction代码#include#includestructNode{std::unordered_map>map_;//UncommentingthefollowingtwolineswillpassVisualStudio2017compilation//Node(Node&&o)=defau

c++ - 是否建议显式地使重写函数成为虚拟的?

在C++11之前,当在派生类中重写虚函数时,建议将virtual关键字也添加到派生类函数中以明确意图。现在这样的函数被标记为“override”,其中包含必须有一个虚拟基函数的概念。因此,我现在更愿意省略虚拟:classDerived:publicBase{public:voidOverriden()override;//Insteadof:virtualvoidOverriden()override;};然而,这会导致MSVC2012中出现IntelliSense错误:'override'修饰符需要一个带有显式'virtual'关键字的虚函数声明明明是编译器编译的类,但是报错让我想了

c++ - 为什么显式初始化列表更容易失败?

在《InsidetheC++objectmodel》一书中,作者说:Therearethreedrawbacksofanexplicitinitializationlist:Itcanbeusedonlyifalltheclassmembersarepublic.Itcanspecifyonlyconstantexpressions(thoseabletobeevaluatedatcompiletime).3.Becauseitisnotappliedautomaticallybythecompiler,thelikelihoodoffailuretoinitializeanobjec

c++ - 我可以避免为 std::variant 中的每个结构显式编写构造函数吗?

考虑这段代码:#includestructx{inty;};intmain(){std::variantv(std::in_place_type,{3});/*1*/returnstd::get(v).y;}这不会编译,从行/*1*/中删除{}时也不会编译,即使聚合初始化也是如此xa{3};xb({3});以两种“类似构造函数”的形式工作。我能否以某种方式让std::variant初始化程序意识到使用聚合初始化构造结构的可能性,而不必为可能在我的真实案例中使用的每个结构编写无聊的样板构造函数?我希望它能以某种方式工作,按照cppreference有问题的两个重载(5)和(6)都说Con

c++ - 使用显式命名空间限定符时,模板实例化行为会发生变化吗?

我一直在试验一个可组合管道系统,它涉及一组“阶段”,这些阶段可能是模板化的。每个阶段处理自己的设置、执行和清理,模板推导用于构建管道使用的“状态”的最小列表。这需要相当多的样板模板代码,这些代码显示出一些明显不协调的行为。尽管实验成功,但实际上将其滚动到我们的代码库中会由于实例化无效而导致错误。我们花了一些时间来找出玩具(工作)解决方案和更丰富的版本之间的差异,但最终缩小到明确的命名空间规范。templatestructbind_stage{static_assert(!std::is_same::value,"Nope,someonedefaultinstantiatedme");}

c++ - C++ 编码人员通常会显式地进行 move ,还是只依赖编译器来完成?

我们在某些函数中有这个:BigClassbig;//preparebigsomehowOtherClassfoo(std::move(big),maybe,other,params);//knowthatwewon'tbeusing"big"afterthis.现在大多数C++编码人员是否真的会把move放在那里以保证move? 最佳答案 在您的特定代码段中,要么直接move,要么根本不move。编译器永远不会移出左值(不是eXpiring)。 关于c++-C++编码人员通常会显式地进行

c++ - 如果类成员是 vector ,我们是否应该显式地编写一个复制构造函数?

structmyType{vectorls;};这里ls持有指向char的指针。如果未提供myType的用户定义复制构造函数,myType的默认复制构造函数是否会执行ls的深层复制? 最佳答案 Herelsisholdingpointertochar.Ifcopyconstructorisnotprovided,willdefaultcopyconstructordothedeepcopy?默认的复制构造函数将复制所有成员——即调用它们各自的复制构造函数。1所以是的,std::vector(就C++而言没有什么特别之处)将被正式复制

c++ - 使用花括号初始化列表调用显式构造函数 : ambiguous or not?

考虑以下几点:structA{A(int,int){}};structB{B(A){}//(1)explicitB(int,int){}//(2)};intmain(){Bparen({1,2});//(3)Bbrace{1,2};//(4)}(4)中brace的构造清楚明确地调用了(2)。在clang上,(3)中paren的构造明确调用了(1),而在gcc5.2上,它无法编译:main.cpp:Infunction'intmain()':main.cpp:11:19:error:callofoverloaded'B()'isambiguousBparen({1,2});^main.c

c++ - SFINAE:检测是否存在需要显式专门化的模板函数

作为mypreviousquestion的后续行动,我正在尝试检测是否存在需要显式专门化的模板函数。我当前的工作代码检测非模板函数(感谢DyP的帮助),前提是它们至少采用一个参数以便可以使用依赖名称查找://switchto0totesttheothercase#defineENABLE_FOO_BAR1namespacefoo{#ifENABLE_FOO_BARintbar(int);#endif}namespacefeature_test{namespacedetail{usingnamespacefoo;templatedecltype(bar(std::declval()))t