草庐IT

表达力

全部标签

c++ - C++14 中泛型 Lambda 中的依赖表达式和 ODR 使用

voidf(int,constint(&)[2]={}){}//#1voidf(int,constint(&)[1]){}//#2//voidf(constint&,constint(&)[1]){}//#2_originalvoidtest(){constintx=17;autog=[](autoa){f(x);//OK:calls#1,doesnotcapturex};autog2=[/*=*/](autoa){intselector[sizeof(a)==1?1:2]{};f(x,selector);//OK:isadependentexpression,socapturesx?

C++ 表达式模板生命周期

我在https://en.wikipedia.org/wiki/Expression_templates查看表达式模板的示例.然后我尝试制作一个简单的符号表达式树,即添加常量和变量,如a+b+10。所以我从#includetemplateclassExpression{public:std::ostream&print(std::ostream&os)const{returnexpression().print(os);}Econst&expression()const{returnstatic_cast(*this);}};classVar:publicExpression{publ

c++ - 表达式模板 - 修饰名称长度超出

我从我的代码中收到“超出装饰名称长度”的警告我查看了类似问题的SO答案。*注意我知道如何关闭它(pragma),我也知道这是一个我可以“忽略”的警告,基于unix的编译器可能不会发出它:P*这个问题有一个实际因素,如果我遇到错误,我必须费力地浏览一些非常可怕的文本和模板。这些错误目前主要是由于拼写错误造成的,但如果我有任何细微的问题,那么真正找到问题所在将是一场噩梦。我的代码可以编译并运行,但正如我上面所说的,我收到了警告。我有一个“比较”小的表情...autoexpression=(l,aComma,w,aComma,x,aComma,y,aComma,z);std::cout我从我

c++ - ‘const’ 错误之前的预期主表达式

请帮忙。我收到很多错误。sub2.cpp:在函数“intmain()”中:sub2.cpp:11:14:错误:从‘constchar*’到‘char’的无效转换[-fpermissive]sub2.cpp:12:14:错误:从‘constchar*’到‘char’的无效转换[-fpermissive]sub2.cpp:16:17:错误:'const'之前需要主表达式sub2.cpp:16:36:错误:'const'之前需要主表达式sub2.cpp:11:6:警告:未使用的变量“外部”[-Wunused-variable]sub2.cpp:12:6:警告:未使用的变量‘inner’[-W

C++:检查表达式是否编译的模板

在使用SFINAE编写模板特化时,您经常会因为一个不存在的小成员或函数而需要编写一个全新的特化。我想将此选择打包成一个小声明,如orElse.小例子:templateintget(T&v){returnorElse();}这可能吗? 最佳答案 orElse()的意图很清楚,但如果这样的事情可能存在,它必须是以下之一:召唤阵容orElse(v,&V::get,0)orElse(v,0)orElse(v)哪里v类型为V,以及由此实例化的函数模板分别是:函数模板阵容templateintorElse(T&obj,int(T::pmf*)(

c++ - Rust 中有类似表达式模板的东西吗?

在C++中,表达式模板是一种技术,它依赖于编译器对C++代码中表达式的了解来简化它们并优化它们,使其超出过程程序中的可能范围。这是一种强大的技术,例如,Eigen和Armadillo矩阵库,以加速矩阵上的某些复合运算。一个incompletewikipageontheEigenwebpage几乎要开始解释了。我想知道Rust中是否存在类似的技术,即是否有办法让Rust编译器在编译时优化某些表达式,以便创建最少数量的临时对象。 最佳答案 如果我阅读ExpressionTemplates是的,然后您可以看到它们与Rust迭代器一起运行:

c++ - 如何在函数调用后初始化变量,就像 new 表达式提供的那样?

目前我正在研究自定义内存分配,其中一个缺点是我必须编写多行代码才能获得与new-expression相同的结果。仅提供一个简单的调用。简单的初始化:MyClass*obj=newMyClass(3.14);不太简单的初始化:void*obj_mem=alloc->Allocate(sizeofMyClass,alignof(MyClass));MyClass*obj=new(obj_mem)MyClass(3.14);我将向我的项目组提供分配器,例如那个分配器,并希望他们实际使用它们,而不是返回调用new,因为我们需要这些更快的分配器来管理我们的内存。但要实现这一点,我将不得不设计出最

c++ - 可以在 constexpr 上下文中使用导致未指定(不是未定义!)行为的指针的表达式吗?

根据cppreference(强调我的):Acoreconstantexpressionisanyexpressionthatdoesnothaveanyoneofthefollowinginanysubexpression(...)Anexpressionwhoseevaluationleadstoanyformofcorelanguageundefinedbehavior(includingsignedintegeroverflow,divisionbyzero,pointerarithmeticoutsidearraybounds,etc).Whetherstandardlibr

c++ - C++ 中是否允许浮点表达式收缩?

浮点表达式有时可以在处理硬件上收缩,例如使用融合乘加作为单个硬件操作。显然,使用这些this不仅仅是一个实现细节,还受编程语言规范的约束。具体来说,C89标准不允许这样的缩略,而在C99中,只要定义了一些宏,它们是允许的。详见thisSOanswer.但是C++呢?是否不允许浮点收缩?某些标准允许吗?普遍允许? 最佳答案 总结收缩是允许的,但为用户提供了一个工具来禁用它们。标准中不明确的语言笼罩了禁用它们是否会提供预期结果的问题。我在官方C++2003标准和2017n4659草案中对此进行了调查。除非另有说明,否则C++引文均来自2

c++ - 如何通过引用为 C++0x 传递 Lambda 表达式参数

我正在使用C++0xlambda表达式来修改映射的值。但是,很难通过引用传递map迭代器。如果我只是通过迭代器传递值,例如:[](std::pairiter)它编译正常,但map中的值没有更新。如果我尝试通过引用传递迭代器,例如[](std::pair&iter)VS2010编译器提示它cannotconvertparamaterfrom'std::pair'to'std::pair&'这是代码。了解有关如何使用lambda表达式修改std::map对象的信息。#include#include#include#includeint_tmain(intargc,_TCHAR*argv[]