在他的CppCon2014演讲中"TypeDeductionandWhyYouCare",ScottMeyers提出了一个问题,为什么在C++11/C++14标准中有关于auto和大括号初始化器的特殊规则(他的问题从at36m05s开始)。auto与braced-init-list组合的语义在§7.1.6.4/6中定义。我想了想,也想不出一个用例。到目前为止,我所看到的最接近的例子是BjarneStroustrup使用它的一个例子。在他的Cpp2014talk"MakeSimpleTasksSimple!",他曾经使用auto来捕获初始化器(但只是作为一种变通方法)。这是代码(幻灯片3
我有一些通用代码想知道何时传递了一系列对象,这些对象的数量在编译时是已知的,因为它可以选择替代算法策略。为此,我尝试写一个has_constexpr_size(T)如下所示的constexpr函数试图探测T的size()成员函数以查看它是否可以作为constexpr执行。请注意,这里与通常的“我可以检测constexpr执行上下文吗?”有一个关键区别。问题,因为一些STL容器,如array总是提供一个可用的constexprsize()功能而其他STL容器,如initializer_list获得可用的constexprsize()当且仅当初始化列表本身是constexpr时才起作用(因
考虑这个伪片段:classSomeClass{public:SomeClass(){if(true){fooCall=[](autoa){coutstd::functionfooCall;};我想要的是一个存储通用lambda的类成员fooCall,它又在构造函数中赋值。编译器提示fooCall不能成为模板化数据成员。有没有关于如何在类中存储通用lambda的简单解决方案? 最佳答案 您无法在运行时在两个通用lambda之间进行选择,因为您没有具体的签名来进行类型删除。如果您可以在编译时做出决定,您可以将类本身模板化:templat
我在Linux上使用ICC14.0.2。此代码片段使用GCC和CLang编译,但不使用ICC:templatestructA;templatestructA{templatestructNested{};};templatestructA:publicA{};templatestructA::Nested;//explicitinstantiation尝试用三个编译器编译:$g++-c-std=c++11testcase.cc$clang++-c-std=c++11testcase.cc$icpc-c-std=c++11testcase.cctestcase.cc(17):error:
我刚刚阅读了C++14中可用的名为“返回类型推导”的新功能,我对该类型的函数中的递归有疑问。我了解到该函数中的第一个返回必须允许推断返回类型。Wiki提供的示例完全符合该规则。autoCorrect(inti){if(i==1)returni;//returntypededucedasintelsereturnCorrect(i-1)+i;//oktocallitnow}autoWrong(inti){if(i!=1)returnWrong(i-1)+i;//Toosoontocallthis.Nopriorreturnstatement.elsereturni;//returntyp
我想根据参数选择在构造函数中初始化的union成员。以下是一个有效的示例:structA{union{inti;floatf;};A(doubled,boolisint){if(isint)new(&i)int(d);elsenew(&f)float(d);}};当我使用int和float时,目标是使用其他更复杂的类型(但在C++14union中仍然允许),因此使用placement-new(而不是分配)。问题是这个构造函数不能是constexpr因为在constexpr方法中不允许放置新的。有没有办法解决这个问题(除了使isint参数成为正式类型系统的一部分)?某种类型的条件初始化器
我一直在读一本关于C++14/11的书。我刚读完有关constexpr关键字的一章。我知道它的用途,但我应该多久使用一次constexpr?我是否应该在我知道永远不会用于创建contstexpr对象的类的代码中使用它?(以防万一,因为它不需要我任何费用,对吧?) 最佳答案 C++14HowoftenshouldIuseconstexpr?在ScottMeyer's的第15项(尽可能使用constexpr)中有广泛的讨论。书EffectiveModernC++.这一项的概要是应该尽可能使用constexpr,因为constexpr函数
在阅读C++14的这一部分时(afreedraftN4141,closesttoC++14):9.8Localclassdeclarations[class.local][..]Thenameofalocalclassislocaltoitsenclosingscope.[..]Declarationsinalocalclassshallnotodr-use(3.2)avariablewithautomaticstoragedurationfromanenclosingscope.[Example://[..]voidf(){staticints;intx;//[..]structlo
但它在gcc4.9.0中编译。参见liveexample:#includestructA{constexprA():i(5){}int&&f(){returnstd::move(i);}inti;}a;A&&f(A&a){returnstd::move(a);}intmain(){Aa;intb[a.f()]{0,1,2,3,4};std::cout从§5.19/3我们有:Anintegralconstantexpressionisanexpressionofintegralorunscopedenumerationtype,implicitlyconvertedtoaprvalue,
我正在使用g++并编写一个简单的函数:#includestd::shared_ptrptr;boolfails_compiling(){returnptr;}从我在界面中看到的内容来看,shared_ptr实现包括一个bool运算符,我什至可以像这样应用快速修复:returnstatic_cast(ptr);现在可以编译了。为什么返回算法不像if()和while()那样尝试自动转换为bool? 最佳答案 如果你结账std::shared_ptr的bool转换运算符,您会看到它被声明为:explicitoperatorbool()co