草庐IT

ConstexPR

全部标签

c++ - 无 ODR 使用的完美转发

考虑以下代码片段,就像写在头文件中一样:structFoo{//...};templateFoomakeFoo(Args&&...args){return{std::forward(args)...};}我可以用一些参数调用makeFoo,然后返回一个Foo。太好了。现在我要做的是用标签替换一些makeFoo的参数,看起来就像这样(仍在头文件中):constexprstructtag_type{usingtype=ActualType;}tag;应该在makeFoo中检测到这些标签,并在调用Foo的构造函数之前替换实际对象。所以调用看起来像:automyFoo=makeFoo("hi"

c++ - 将 constexpr 结构转换为运行时结构

我正在尝试使用模板类(此处为Foo),其基本类型如下:hana::tuple,Runtime>>与Runtime一个显然不能是constepxr的类.但是类型可以用多种方式构造,这就是我使用的原因:hana::tuple,hana::type>>在编译时完成工作。所以问题基本上是如何从第一个元组类型转换为第二个元组类型。不知hana里面有没有东西那可以帮助我。或者更好的是,关于这种“转换”的一些技巧。namespacehana=boost::hana;usingnamespacehana::literals;structRuntime{std::vectordata;};templat

c++ - 使用 "if constexpr"防止元组越界

以下代码在GCC和Clang下编译良好,但在VisualStudio(/std:c++latest)的最新更新中停止工作:#includetemplatevoidcheck_tuple(T...types){ifconstexpr(pos>::type;}}intmain(){check_tuple(1.0,1.0);check_tuple(1.0,1.0);}在最新版本的VisualStudio(/std:c++latest)中,编译失败,元组索引越界(std::tuple_element>)。是否可以像这样使用constexpr来防止元组越界? 最佳答案

c++ - lambda 表达式中引用捕获和非显式捕获的 constexpr 变量之间的区别

这个问题Accesstoconstexprvariableinsidelambdaexpressionwithoutcapturing回答了为什么下面示例中的ref-capture不是严格必要的。但另一方面,如果它被捕获,则会出现错误。错误似乎是由foo()的递归性质触发的。templateconstexprintbar(constT&x){//NOK//constexprintbar(Tx){//OKreturnx;}templateintfoo(constT&l){constexprautox=l()-1;autoy=[&]{returnbar(x);};//ifref-captu

c++ - 为什么不能使用 constexpr 全局变量来初始化 constexpr 引用类型?

#includeusingnamespacestd;constexprintr=100;intmain(){constexprint&k=r;cout编译此代码会在编译时出现“错误:将‘constint’绑定(bind)到‘int&’类型的引用会丢弃限定符”。 最佳答案 编译时在int后加入constconstexprintconst&k=r;//...........^^^^^问题是constepxr隐含了const,所以当你定义rconstexprintr=100;您将constexpr定义为intconst值(还要考虑cons

C++ 我怎样才能改进这个模板元程序来返回包含大小的数组?

我有一个名为choose_literal的实用程序它选择编码为char*,wchar_*,char8_t*,char16_t*,char32_t*的文字字符串取决于所需的类型(选择)。看起来像这样:templateconstexprautochoose_literal(constchar*psz,constwchar_t*wsz,constCHAR8_T*u8z,constchar16_t*u16z,constchar32_t*u32z){ifconstexpr(std::is_same_v)returnpsz;ifconstexpr(std::is_same_v)returnwsz;

c++ - 显式默认的 constexpr ctor 是否应该允许非 constexpr 初始化

我只是偶然发现了GCC和Clang之间关于显式默认的constexprctor和一些继承的以下差异......templatestructA{constexprA()=default;Tv;};structB:A{constexprB()=default;};GCC立即拒绝该代码,而Clang允许实例化这两种类型的非constexpr版本。我的猜测是Clang可能是正确的,但我不能100%确定... 最佳答案 问题归结为:是默认初始化的constexpr构造函数一些内置类型有效的非静态数据成员,如果不使用呢?tl;dr:对于非模板构

没有参数的 C++ 可变参数函数

我有多个类(这里为简单起见Foo和Bar)structBar{};structFoo{};和一个接受单个模板参数并根据该类型执行某些操作的函数:templateconstexprvoiddoSomething(){cout::value在我的代码中,我得到了Foo的模板参数包s和Bars,我应该调用doSomething()每个函数都有函数(我不关心函数执行的顺序)。doStuff();//-->True/False/False到目前为止,我能想到的唯一解决方案是:templateclassDoer;templatestructDoer{staticconstexprvoiddoStu

c++ - 具有三元的简单 C++11 constexpr 阶乘超出了最大模板深度

如果我使用专门化编写编译时阶乘函数,则以下代码就足够了,并将正确提供120作为fact1()的结果:templateconstexprsize_tfact1(){returnN*fact1();}templateconstexprsize_tfact1(){return1;}但是,对于单个函数体和三元运算符,如以下代码所示,G++4.7和Clang++3.2都超过了它们的最大模板实例化深度。看来1永远不会从fact2返回.为什么fact2()的定义是这样的?不返回120?templateconstexprsize_tfact2(){returnN==0?1:N*fact2();}

c++ - 从 c++11 中的用户定义文字返回 std::array

我刚刚安装了gcc-4.8.1,当我意识到我可以执行-std=c++1y并获得多行constexpr时,我非常兴奋。我很想知道,是否有办法使这项工作正常进行?#includeconstexprautooperator""_a1(constchar*text,constsize_tsize)->std::array{std::array()blah;std::strncpy(blah.data(),test,size);//dosomestufftoblahatcompiletimereturnblah;}intmain(){autoblah="helloworld"_a2;}但是我变得