草庐IT

表达力

全部标签

c++ - 表达式转换问题

假设我们有以下语句:s=3*a*b-2*c,其中s,a,b和c是变量。此外,我们使用了ShuntingYard构建算法RPN表达式,所以现在我们可以为变量a、b和c赋值,并使用简单的方法计算s值RPN评估器。但是,问题是我应该能够计算任何变量a、b或c的值设置了其他变量。因此,我需要以某种方式转换现有表达式以获得一组表达式:a=(s+2*c)/(3*b)b=(s+2*c)/(3*a)c=(3*a*b-s)/2如何根据一个原始语句生成这样的表达式?是否有解决此类问题的标准方法?约束:一组可用的运算符:+、-、*、/,包括一元+和-运算符*、/和=两边不能有相同的变量(例如s=a*a或s=

c++ - 表达式模板 - 无法专门化函数模板

我试图制作一些表达式模板作为对thisquestion的回答,但我遇到了编译器错误,我无法弄清楚。到目前为止,我已经获得了相当小的SSCCEtemplateclassinherit2:privatesub_expr{//line3public:inherit2(sub_exprrhs):sub_expr(rhs){}templateautooperator()(constT&v)const->decltype(sub_expr::operator()(v))//line7{returnsub_expr::operator()(v);}};classexpression_paramete

c++ - 未使用依赖类型的“预期主表达式”错误

在下面的代码中,main()中的'bObj->b()'行可以编译,但是'cObj->c()'行会给出一个错误'expectedprimary-expressionbefore'>'token'。这与依赖类型无关;在适当的地方添加"template"或"typename"没有帮助。关于问题是什么的任何提示?在此代码的“真实”版本中,函数“b”还有许多其他模板和非模板版本。问题可能只发生在一个地方,而不是其他地方,但我无法确定重要的区别是什么。#includeclassA{};classD:publicA{};classB{public:templateboost::shared_ptrb

c++ - 在 lambda 表达式中使用外部函数

是否可以在lambda表达式中调用外部函数,如果不能,是否有另一种方法可以使用transform和外部函数来实现?inthalf(intx){returnx/2;}intmain(){std::vectortest(5);std::transform(test.begin(),test.end(),test.begin(),[](){returnhalf(4);});return0;} 最佳答案 是的,itisdefinitelypossible.事实上,您的代码的唯一问题是您的lambda应该接受int。通过该修复,您的代码com

c++ - Clang 为直觉上应该等效的表达式提供非常不同的性能

有人可以向我解释这些表达式之间的这些显着性能差异,我希望它们能提供相似的性能。我在Release模式下使用AppleLLVM版本5.1(clang-503.0.38)(基于LLVM3.4svn)进行编译。这是我的测试代码(只需将CASE更改为1、2、3或4来测试自己):#include#include#defineCASE1inlineintfoo(intn){return#ifCASE==1(n%2)?9:6#elifCASE==2(n%2)==true?9:6#elifCASE==36+(n%2)*3#elifCASE==46+bool(n%2)*3#endif;}intmain(

c++ - 为什么不允许在 const 非 volatile 成员函数上消除公共(public)子表达式?

C++的目标之一是允许用户定义类型的行为与内置类型一样好。这似乎失败的一个地方是编译器优化。如果我们假设const非volatile成员函数在道德上等同于读取(对于用户定义的类型),那么为什么不允许编译器消除对此类函数的重复调用呢?例如classC{...public:intget()const;}intmain(){Cc;intx{c.get()};x=c.get();//whynotallowthecompilertoeliminatethiscall}允许这样做的论点与复制省略的论点相同:虽然它改变了操作语义,但它应该适用于遵循良好语义实践的代码,并在效率/模块化方面提供实质性改

c++ - 松散常量表达式中 union 非事件成员的左值到右值转换的解决方法

触发union的非事件成员的左值到右值转换不是常量表达式。也就是说,给定union:templateunionA{constexprA(Tt):t_{t}{}constexprA(Uu):u_{u}{}Tt_;Uu_;};和constexpr函数foo:templateconstexprautofoo(){Aa(T{});returna.u_;}以下程序:intmain(){constexprautotest=foo();return0;}失败并显示错误消息:error:constexprvariable'test'mustbeinitializedbyaconstantexpress

c++ - 涉及函数类型的表达式是左值还是右值?

voidfn(){}void(&lref)()=fn;void(&&rref)()=fn;intmain(){}在g++4.8.1下编译良好。所以,fn是一个表达式,根据ISO标准,表达式必须有一个类别。在执行任何自动类型提升之前,表达式属于哪个类别(因为两个引用都可以接受表达式fn的计算结果)? 最佳答案 根据C++113.10/1,函数始终是左值。所以表达式fn是一个左值。根据8.5.3/5,正确类型的函数可用于初始化右值引用:Otherwise,thereferenceshallbeanlvaluereferencetoano

一文总结 C++ 常量表达式、constexpr 和 const

TLDR修饰变量的时候,可以把constexpr对象当作加强版的const对象:const对象表明值不会改变,但不一定能够在编译期取得结果;constexpr对象不仅值不会改变,而且保证能够在编译期取得结果。如果一个const变量能够在编译期求值,将其改为constexpr能够让代码更清晰易读。constexpr函数可以把运行期计算迁移至编译期,使得程序运行更快(但会增加编译时间)。但如果constexpr函数中存在无法在编译期求值的参数,则constexpr函数和普通一样在运行时求值,此时的返回值不是常量表达式。1.常量表达式和constexprC++11中引入了constexpr关键字。c

c++ - 在常量表达式中更改 union 的事件成员

玩constexpr和union我发现,我无法更改union的活跃成员在constexpr.只有一个异常(exception):union空类。constexprboolt(){structA{};structB{};unionU{Aa;Bb;}u{};u.a=A{};u.b=B{};returntrue;}static_assert(t());constexprboolf(){structA{charc;};structB{charc;};unionU{Aa;Bb;}u{};u.a=A{};u.b=B{};//errororiginatingfromherereturntrue;}s