草庐IT

constexpr-ness

全部标签

c++ - 使用 constexpr 函数的返回值作为另一个函数的参数

我有一个constexpr函数,它根据字符串文字计算CRC32散列。templateconstexpruint32_tctcrc32(constchar(&str)[len]){returndetail::crc32(str)^0xFFFFFFFF;}(引用其他constexpr函数)我想做的是调用其他一些接受uint32_t值的函数,并使用它来访问某些unordered_map中的数据。这样的调用看起来像这样:uniformByNameCRC32(ctcrc32("uPointLight.position"));我希望"uPointLight.position"的散列在构建时计算一次

c++ - 是否有一种非间接、非 hack 的方法来保证 constexpr 函数只能在编译时调用?

目前,我们有两个主要的编译时评估选项:模板元编程(通常使用模板结构和/或变量)和constexpr操作1。templatestructsum_{enum{value=l+r};};//Withstruct.templateconstintsum=sum_::value;//Withstruct&var.templateconstintsub=l-r;//Withvar.constexprintmul(intl,intr){returnl*r;}//Withconstexpr.其中,我们保证所有四个都可以在编译时求值。templatestructCompileTimeEvaluable{

c++ - 将一个 constexpr 数组初始化为其他两个 constexpr 数组的总和

给定两个constexpr数组(type[N]或std::array)constexprintA[5]{0,1,2,3,4};constexprintB[5]{5,4,3,2,1};是否可以初始化一个新的constexpr数组执行逐元素操作(或constexpr函数)?比如这段代码可以constexprintsum(inti){returnA[i]+B[i];}constexprintS[5]{sum(0),sum(1),sum(2),sum(3),sum(4)};以调用sum(i)的形式更方便地重写对于S中的每个元素? 最佳答案

c++ - 数组可以声明为 const 变量而不是 constexpr 的大小吗?

这段C++代码是否正确?constsize_ttabsize=50;inttab[tabsize];问题是我已经看到很多关于这个问题的相互矛盾的意见。甚至##c++IRCchannel和编程论坛上的人也声称截然不同的事情。有人说上面的代码是正确的。其他人则认为不是,应该是这样的:constexprsize_ttabsize=50;inttab[tabsize];既然我已经被“C++专家”的相互矛盾的意见搞得够糊涂了,我能请问一个合理的支持答案吗?非常感谢! 最佳答案 在C++中,常量整数的处理方式与其他常量类型不同。如果它们是用编译

c++ - 拥有 constexpr 静态字符串会导致链接器错误

下面的程序给我一个链接时错误:#includestructTest{staticconstexprchartext[]="Text";};intmain(){std::cout错误信息是/tmp/main-35f287.o:Infunction`main':main.cpp:(.text+0x4):undefinedreferenceto`Test::text'main.cpp:(.text+0x13):undefinedreferenceto`Test::text'clang:error:linkercommandfailedwithexitcode1(use-vtoseeinvoc

c++ - Clang 不会在编译时为非 constexpr 变量计算 constexpr 函数的值

部分代码:constexprintsum(inta,intb){returna+b;}intmain(){inta=sum(4,5);return0;}我用clang-9编译这段代码,但它在编译时不会计算main函数中inta的值。如果我使用constexprintaclang会在编译时评估它,但我无法在运行时更改此变量。但是gcc-7.1在编译时计算inta的值。为什么会这样?如何解决? 最佳答案 当您希望在编译时预先计算一个值然后绑定(bind)到允许修改的标识符时,您只能通过使用constexpr初始化非constexpr对象

c++ - 有没有办法将 `constexpr` 值传递给 lambda,以便它在该 lambda 中保持 `constexpr`?

这是我想做的;发布整个代码,因为它不是太长,并且还可以演示我要解决的具体任务。基本上,我需要一种方法来按索引迭代参数包中的值(索引部分很重要,尽管在本例中不需要)。#include#include#includetemplateconstexprvoidstatic_for(Functor&&f){ifconstexpr(First{});static_for(std::forward(f));}}templateautovalue_by_index(Args&&...args)noexcept{returnstd::get(std::forward_as_tuple(std::for

c++ - clang 中的 constexpr 错误,但 gcc 中没有?

让我们举个简单的例子:#includenamespacefoo{constexprintmain(intargc,char*argv[]){//code}}intmain(intargc,char*argv[]){returnfoo::main(argc,argv);}取决于代码是什么,clang会提示或不提示。如果代码是:coutclang提示:error:constexprfunctionneverproducesaconstantexpression[-Winvalid-constexpr]constexprintmain(intargc,char*argv[]){note:no

c++ - 在哪个编译单元中有一个 constexpr 变量?

考虑这段代码:structfoo{staticconstexprintvalue=42;};voidbar(constint*value){std::cout这在couple下编译正常并且没有警告的onlinecompilers我试过。鉴于没有单个.cpp文件定义constexpr值,如果从中调用bar方法,指针的值是否会有所不同不同的编译单元?或者标准是否保证该值最终只在所有编译单元中分配一次(即隐式_declspec(selectany))? 最佳答案 它对我不起作用---我收到链接器错误。http://coliru.stack

c++ - for 语句中的 constexpr

c++17提供ifconstexpr,其中:thevalueofconditionmustbeacontextuallyconvertedconstantexpressionoftypebool.Ifthevalueistrue,thenstatement-falseisdiscarded(ifpresent),otherwise,statement-trueisdiscarded有没有办法在for语句中也使用它?要在编译时展开循环?我希望能够做这样的事情:templatevoidfoo(){forconstexpr(autoi=0;i 最佳答案