草庐IT

constexpr-ness

全部标签

c++ - g++ 不编译带有断言的 constexpr 函数

templateconstexprinlineTgetClamped(constT&mValue,constT&mMin,constT&mMax){assert(mMinmMax?mMax:mValue);}error:bodyofconstexprfunction'constexprTgetClamped(constT&,constT&,constT&)[withT=longunsignedint]'notareturn-statement使用g++4.8.1。clang++3.4没有提示。谁在这里?有什么方法可以让g++在不使用宏的情况下编译代码? 最佳

c++ - constexpr end istream (sentinel) 迭代器有什么意义?

N2976建议添加constexpr到标准库中的某些位置。它指出iostreams不适合constexpr除了结束迭代器。所以istream_iterator和istreambuf_iterator给出了constexpr默认构造函数,仅此而已。例如,您可以在libstdc++implementation中看到那constexpr在整个文件中只出现一次。引发此更改的LWG是#1129.它说:istream_iteratorandistreambuf_iteratorshouldsupportliteralsentinelvalues.Thedefaultconstructorisfre

c++ - 隐式虚 constexpr 函数

虚函数不能是constexpr但是,当一个函数通过继承隐式虚函数时,我试过的编译器不会提示它。这是一个示例代码:classA{virtualvoiddoSomething(){}};classB:publicA{constexprvoiddoSomething()override{}//implicitlyvirtualconstexpr//butnocompilationerror};classC:publicA{virtualconstexprvoiddoSomething()override{}//explicitlyvirtualconstexpr//compilationer

c++ - constexpr std::array with static_assert

#include#includeintmain(intargc,char**argv){constexprconststd::arrayarr{{0,1}};constexprconstintarr2[]={0,1};static_assert(arr[0]==arr2[0],"asdf");static_assert(arr[1]==arr2[1],"asdfasdf");return0;}当使用gcc4.8.2和4.9.1使用g++test.cpp--std=c++11编译时,编译成功。但是,当使用clang++test.cpp--std=c++11使用clang3.4和3.5编译

c++ - 为什么我应该更喜欢类中的 static constexpr int 而不是类级整数常量的枚举?

C++17更新:staticconstexpr变量是隐式内联,因此不需要外部定义。原始问题:假设我有一个常量列表,例如structCls{staticconstexprintN=32;staticconstexprintM=64;};这当然建议我为这些添加定义以避免可能发生的ODR使用问题,因此我需要:constexprintCls::N;constexprintCls::M;为什么应该我更喜欢这个structCls{enum:int{N=32,M=64};};这让我免于ODR使用的麻烦,因为N和M更真实地只是常量,而不是对象本身(如果这是标题,那就更重要了-only)并且更短。我可以

c++ - constexpr std::optional 重置

我正在审查C++-17std::optional类模板的接口(interface),并注意到reset和assignment来自nullopt的未标记为constexpr。这是一个疏忽还是无法将此操作标记为constexpr的原因? 最佳答案 有一个原因,就是[expr.const]以前禁止:anassignmentexpressionorinvocationofanassignmentoperator([class.copy])thatwouldchangetheactivememberofaunion;由于P1330:Chang

c++ - 使用 constexpr 函数作为模板参数是否有效?

constexprintget(){return5;}templatestructTest{};intmain(){inta[get()];//okTestobj;//error:'intget()'cannotappearinaconstant-expression}我有compiledthiscodewithideone.并且想知道为什么会出现编译错误。是constexpr函数不允许作为template参数还是编译器中的错误?编辑:将constintget()更改为intget()此外,ideone还有一个错误是,如果您删除constexpr那么stilldeclaringanar

c++ - constexpr 用指针初始化

我正在尝试使用指向int的指针来初始化constexpr声明,int是一个const对象。我也尝试用一个不是const类型的对象来定义一个对象。代码:#includeintmain(){constexprint*np=nullptr;//npisaconstanttointthatpointstonull;intj=0;constexprinti=42;//typeofiisconstintconstexprconstint*p=&i;//pisaconstantpointertotheconstinti;constexprint*p1=&j;//p1isaconstantpointe

c++ - constexpr 变量的唯一地址

是否可以为constexpr变量分配一个唯一的地址,即变量可用的所有翻译单元都相同(通常通过标题)?考虑以下示例://foo.hh#includeconstexprintfoo=42;//a.cc#include"foo.hh"voida(void){std::cout分别编译a.cc和b.cc,并使用gcc4.7将它们链接在一起,我看到打印了两个不同的地址。如果我在header中添加关键字extern,我会收到链接器错误duplicatesymbol_fooin:a.oandb.o我觉得有点奇怪,因为我认为添加extern更有可能导致编译器从另一个对象导入该符号,而不是从当前对象导出

c++ - 转发声明一个 constexpr 变量模板

我尝试像这样转发声明一个constexpr变量模板:templateconstexprstd::size_titerator_category_value;目标是记录每个特化都应该是constexpr但我不得不承认我从未检查过它是否合法并且g++对此很满意。然而,当我尝试用clang++编译这个spinnet时,我得到了以下错误:error:defaultinitializationofanobjectofconsttype'conststd::size_t'(aka'constunsignedlong')constexprstd::size_titerator_category_va