草庐IT

constexpr-ness

全部标签

c++ - 在 C++ 14 中检测 constexpr size() 成员函数

我有一些通用代码想知道何时传递了一系列对象,这些对象的数量在编译时是已知的,因为它可以选择替代算法策略。为此,我尝试写一个has_constexpr_size(T)如下所示的constexpr函数试图探测T的size()成员函数以查看它是否可以作为constexpr执行。请注意,这里与通常的“我可以检测constexpr执行上下文吗?”有一个关键区别。问题,因为一些STL容器,如array总是提供一个可用的constexprsize()功能而其他STL容器,如initializer_list获得可用的constexprsize()当且仅当初始化列表本身是constexpr时才起作用(因

c++ - g++ 提示 constexpr 函数不是常量表达式

我已将我的问题简化为以下内容:structA{staticconstexprstd::size_tf(){return4;}};templatestructB:A{alignas(A::f())chara[N];};我看不出这有什么问题,但是如果我尝试使用g++进行编译:main.cpp:9:19:error:expression'A::f'isnotaconstant-expressionalignas(A::f())chara[N];^main.cpp:9:confusedbyearliererrors,bailingout可以复制oncoliru. 最

c++ - integral_constant 与 constexpr

您能否解释一下,为什么以下示例中的integral_constant和constexpr方法会导致不同的行为?#includeusingnamespacestd;structLogger{//template//usingIsRawString=//std::integral_constant::value||std::is_same::value>;templateconstexprboolIsRawString(){returnstd::is_same::value||std::is_same::value;}templatestructTraits{staticconstintI

c++ - 指针中的 constexpr 有区别吗

constexprint*np=nullptr和intconst*np=nullptr有什么区别?在这两种情况下,np都是一个指向null的常量指针。constexpr在指针上下文中是否有任何特定用途。 最佳答案 如果您尝试对指针做任何事情并在常量表达式中使用结果,则必须将指针标记为constexpr。简单的例子是指针运算,或指针取消引用:staticconstexprintarr[]={1,2,3,4,5,6};constexprconstint*first=arr;constexprconstint*second=first+1

c++ - constexpr 静态模板函数 : g++ error is a warning on clang

考虑以下片段:#includetemplateconstexprintf(){returnI*f();}templateconstexprintf(){return1;}intmain(){std::cout();return0;}这段代码可以很好地与g++和clang编译。非常好。现在将static添加到模板函数特化中:templateconstexprstaticintf(){return1;}然后g++6.1响应错误:11:error:explicittemplatespecializationcannothaveastorageclass还有clang3.8:11:error:

C++17 make_optional constexpr-ness

Thispage说make_optionalC++17中的函数返回constexproptional.我认为(虽然我可能是错的)这需要optional有一个constexpr复制或移动构造函数。然而,thispage也说不是这样的。我不知道如何make_optional可以按照当前的C++1z草案实现。参见thispost为了澄清。是否有一些解决方法,或者这可能只是标准草案/cppreference的错误? 最佳答案 感谢@Yakk和@T.C.为了他们的解释。我觉得一个例子应该让事情更清楚:structwrapper{intvalu

c++ - Constexpr 转换为 const char[]

很多人都遇到过,我也遇到过。我在C++中使用编译时字符串时遇到了困难。我决定采用显然无法使用的方法:使用template类。这是我想出来的,很普通,没什么特别的,而且也行不通。templateclassstring{public:staticconstexprconstcharvalue[]={chars...};constexprstring(){}constexproperatordecltype(value)&()const{returnvalue;}};templateconstexprconstcharstring::value[];我的想法是制作一个string实例cons

c++ - `if constexpr`,lambda 内部,包扩展内部——编译器错误?

clangversion5.0.0(trunk305664)Target:x86_64-unknown-linux-gnu以下代码编译成功:templatevoidf(){([](auto){ifconstexpr(A==0)return42;elsereturn3.14;}(0),...);}intmain(){f();}...但是这个没有:templatevoidf(){([](auto...){//Variadiclambdaifconstexpr(A==0)return42;elsereturn3.14;}(),...);//Noargument}intmain(){f();}

c++ - 重载模板函数的 constexpr 别名

尝试为该类的特定构造函数在特定类类型上使用别名make_shared。我的最佳尝试:classfoo{public:foo(intx):y(x){}inty;};constexprautonewfoo=static_cast(*)(int)>(std::make_shared);产量:error:invalidstatic_castfromtype‘’totype‘std::shared_ptr(*)(int)’constexprautonewfoo=static_cast(*)(int)>(std::make_shared);我做错了什么? 最佳答案

c++ - if constexpr 和 requires-expression 用于临时概念检查

假设,给定C++17的ifconstexpr和ConceptsTS(例如,在最近的gcc版本中),我们想检查模板函数中的类型是否具有嵌套类型:#includestructFoo{usingBar=int;};templatevoiddoSmth(T){ifconstexpr(requires{typenameT::Bar;})std::cout概念文档很少,所以我可能弄错了,但似乎就是这样(现场示例在Wandbox上)。现在让我们考虑取消注释其他doSmth调用时会发生什么。期望requires子句的计算结果为false似乎是合理的,并且将采用ifconstexpr的else分支。与此