草庐IT

if-constexpr

全部标签

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++ - 带有复制/移动赋值运算符的 enable_if

我有一个类,我想在其中启用复制/移动赋值运算符,仅当该类的类型参数分别不可抛出复制/移动构造时。所以我尝试这样做:#includetemplatestructFoobar{Foobar(Tvalue):x(value){}Foobar(constFoobar&other):x(other.x){}Foobar(Foobar&&other):x(std::move(other.x)){}template::value,typename=typenamestd::enable_if::type>Foobar&operator=(constFoobar&rhs){x=rhs.x;return

c++ - 如何从 #define 中删除 C 风格的转换,以便我可以在预处理器 #if 中使用它?

我想使用以下预处理器定义:[第3方header(无法修改)]#defineSWCI_VERSION_MAJOR(unsignedchar)4#defineSWCI_VERSION_MINOR(unsignedchar)16这样比较时:[我的实现]#ifSWCI_VERSION_MAJOR>=4&&SWCI_VERSION_MINOR>=16然后我得到:fatalerrorC1017:invalidintegerconstantexpression我注意到,如果我在不使用(unsignedchar)的情况下定义它们,指令将被接受,但我无权访问定义,因此我想尽可能解决该问题。

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++ - 确定 if::std::numeric_limits<T> 是否可以安全实例化

类模板::std::numeric_limits只能为类型实例化T,它可以是函数的返回值,因为它总是定义像staticconstexprTmin()noexcept{returnT();}这样的成员函数(有关c++03或c++11中非专用版本的更多信息,请参阅http://www.cplusplus.com/reference/limits/numeric_limits/)。如果T即int[2]实例化将立即导致编译时错误,因为int[2]不能是函数的返回值。包装::std::numeric_limits使用安全版本很容易-如果有一种方法可以确定实例化是否安全::std::numeric

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

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

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