草庐IT

constexpr-ness

全部标签

c++ - 据我所知,下面的函数不是 constexpr,而是用 clang 和 g++ 编译的代码。我错过了什么?

我从N4140的§5.19/2中得到这个例子:constexprintincr(int&n){return++n;}据我所知,这不是一个constexpr函数。但是这段代码是用clang和g++编译的。参见liveexample.我在这里缺少什么? 最佳答案 在C++14中,constexpr函数的规则放宽了,论文N3597:Relaxingconstraintsonconstexprfunctions.该论文探讨了基本原理和效果,包括以下内容(强调我的):AsinC++11,theconstexprkeywordisusedtom

C++11 快速 constexpr 整数幂

在这里打死马。在C中进行整数幂运算的典型(且快速)方法是这种经典方法:int64_tipow(int64_tbase,intexp){int64_tresult=1;while(exp){if(exp&1)result*=base;exp>>=1;base*=base;}returnresult;}但是我需要一个编译时整数幂,所以我继续使用constexpr进行递归实现:constexprint64_tipow_(intbase,intexp){returnexp>1?ipow_(base,(exp>>1)+(exp&1))*ipow_(base,exp>>1):base;}const

c++ - 为什么 constexpr 不是所有函数的默认值?

这个问题在这里已经有了答案:Whydoweneedtomarkfunctionsasconstexpr?(4个答案)关闭6年前。放宽constexpr的规则后,这些函数似乎可以在任何地方使用。它们也可以在常量(constexpr)和局部(可变)变量上调用。所以对我来说,这似乎只是对编译器的提示(如内联)。我只是到处写它,如果编译器提示就删除它。所以编译器似乎知道一个函数是否可以在编译时求值的一切。为什么这不是默认行为,为什么我必须将任何内容标记为constexpr?

c++ - 对于函数 : constexpr const or enum? 中的常量,我应该更喜欢哪个

我习惯用enum{my_const=123;来定义常量},因为在类中,使用staticconstexpr需要类定义之外的一些代码(参见thisquestion)。但是-在函数体中呢?最近我一直注意到人们只是在他们的函数中使用constexpr变量(实际上甚至不屑于const它们),我想知道我是否是一个落后的傻瓜我的时代intfoo(intx){enum:int{bar=456};returnx+bar;}所以,我的问题是:在函数体内使用枚举而不是constexpr变量有什么好处吗? 最佳答案 如果bar是constexprintba

C++11 constexpr 过时的模板元编程?

据我了解,constexpr与模板元编程不同,它不是图灵完备的,所以我相信它们是不一样的。所以问题是constexpr在多大程度上使模板元编程过时了? 最佳答案 constexpr绝对是图灵完备的。允许递归。它是定义在编译时和运行时工作的函数的便捷方式。constexpr函数只是函数,不能对类型执行操作。(当然,除非您使用模板元编程来定义所述函数。)类模板和constexpr都可以用来包含编译时常量表达式,但相似之处仅此而已。它们不是多余的,TMP不会很快消失。不过,一些特别丑陋的编译时计算可能会更优雅地重写为适当的函数。

c++ - constexpr 和初始化

也许已经有人问过类似的问题,当然,这是一个吹毛求疵...我有一堆常量std::map用于在enum(class)值和它们的std::string表示之间切换(双向)。这里有人向我指出,这些映射将在运行时初始化,当其他初始化代码运行时,在我的程序执行所有好东西之前。这意味着常量表达式会影响运行时性能,因为映射是根据它们的枚举字符串对构建的。作为说明性示例,这里是其中一张map的示例:enumclassos{Windows,Linux,MacOSX};constmapos_map={{"windows",os::Windows},{"linux",os::Linux},{"mac",os:

c++ - 无穷大不是 constexpr

我想测试在无穷大附近漂浮的行为。为此,我天真地编写了以下代码:#include#includeintmain(){constexprfloatfoo=std::numeric_limits::infinity()-std::numeric_limits::epsilon();std::cout对我来说有趣的部分是这在GCC7.2中编译良好但在Clang5上失败(提示foo的非constexpr分配)。据我所知,自C++11起,std::numeric_limits::infinity()和infinity()是constexpr,所以我想知道Clang的问题出在哪里。编辑1:删除了不必

c++ - 类本身内部的类对象的静态 constexpr 数组

在C++中是否可能有这样的东西:structFoo{intx;constexprFoo(intx):x(x){}staticconstexprFootable[]={Foo(0),Foo(1),Foo(2),};};我尝试了几种组合,但都没有用。如果表不是Foo类的一部分,它会起作用,但我真的希望它成为Foo命名空间的一部分。编辑:我想要这个的原因是我可以作为Foo::table访问表。我在命名空间中有几个这样的类,如果我可以通过编写usingsomeNamespace::Foo导入我正在使用的类,然后以Foo::table访问表,那将非常方便。如果表在类之外,我必须始终通过编写som

c++ - 类似于 "if constexpr"但用于类定义

ifconstexpr是在C++程序中摆脱预处理器的一大步。然而,它仅适用于函数-如本例所示:enumclassOS{Linux,MacOs,MsWindows,Unknown};#ifdefined(__APPLE__)constexprOSos=OS::MacOs;#elifdefined(__MINGW32__)constexprOSos=OS::MsWindows;#elifdefined(__linux__)constexprOSos=OS::Linux;#elseconstexprOSos=OS::Unknown;#endifvoidprintSystem(){ifcons

c++ - constexpr - 为什么只是一个返回语句?

constexpr函数必须只包含一个return语句,并且每个参数都应该在编译时已知://constexprfunctionsuserecursionratherthaniterationconstexprintfactorial(intn){returnn为什么只有return语句?我的意思是,为什么这是错误的?//constexprfunctionsuserecursionratherthaniterationconstexprintfactorial(intn){inta=222;//anothervariablereturnn 最佳答案