草庐IT

constexpr-ness

全部标签

c++ - gcc 和 clang 中 constexpr 静态成员变量的链接器错误

我有一个片段:enumclassEC{a,b};structB{constexprB(ECec):ec_(ec){}ECec_;};structA_base{constexprA_base(Bb):b_(b){}Bb_;};structA:A_base{staticconstexprBbbb=EC::a;constexprA(Bbbbb):A_base(bbbb){}};intmain(){Aa1(A::bbb);//1Aa2{A::bbb};//2Aa3=A::bbb;//3Aa4={A::bbb};//4}它在支持c++17的现代编译器中编译良好。使用c++11和c++14标准支持

C++17类模板推导const-ness

我正在尝试使用新的c++17类模板推导,在我应用const之前它似乎一切正常。这是我面临的麻烦的一个小例子:#includetemplatestructX{T_data;X(void)=default;X(T&&data):_data{data}{}constexprboolconst_x(void){returnfalse;}constexprboolconst_x(void)const{returntrue;}};templateX(T&&)->X>;intmain(void){Xa;constXb{};Xc{10};constXd{10};static_assert(!a.con

c++ - 如果 constexpr 与 sfinae

随着ifconstexpr的引入在c++17,在c++14中使用编译时SFINAE解决的一些问题/c++11现在可以使用ifconstexpr解决,语法更简单。例如,考虑以下编译时递归的基本示例,以生成打印可变数量参数的子例程。#include#includetemplatevoidprint_sfinae(T&&x){std::coutstd::enable_if_t0)>print_sfinae(T0&&x,T&&...rest){std::cout(rest)...);}templatevoidprint_ifconstexpr(T0&&x,T&&...rest){ifconst

c++ - 为什么 std::bitset<5>{}[0] 不是 constexpr?

std::bitset有constexpr构造函数和constexproperator[]所以下面的代码编译成功:#includetypedefstd::bitsetBitSet;constexprBitSets1;static_assert(!s1[0]);购买为什么下面的代码没有?static_assert(BitSet{}[0]); 最佳答案 当您编写BitSet{}时,会创建一个类型为BitSet的临时对象。但是std::bitset的operator[]对于非常量对象,不是constexpr!在您的第一个示例中,s1隐含地

c++ - 带有字符串操作解决方法的 constexpr?

这previouslyansweredquestion解释了为什么我在下面发布的代码不起作用。我有一个后续问题:是否有一种概念上等效的解决方法,即实现编译时字符串连接,但以C++11实际支持的方式实现?使用std::string完全不是必需的。constexprstd::stringfoo(){returnstd::string("foo");}constexprstd::stringbar(){returnstd::string("bar");}constexprstd::stringfoobar(){returnfoo()+bar();} 最佳答案

c++ - 使用 constexpr auto/char-array 变量观察到的不同行为

跟进这个问题Havingaconstexprstaticstringgivesalinkererror在问题中,这段代码无法编译:#includestructTest{staticconstexprchartext[]="Text";};intmain(){std::cout从评论来看,这段代码是可以编译的:#includestructTest{staticconstexprautotext="Text";};intmain(){std::cout我的问题是,为什么auto版本可以工作,而char版本的数组却不行?能否请您指出标准中允许使用第二个版本而不允许使用第一个版本的声明?我看了

c++ - 将 constexpr 数组复制到类中

假设我有一个类:classMyClass{chararray[12];public:MyClass(constchar*arr){for(intx=0;x是否可以使MyClass构造函数constexpr。棘手的部分是初始化新数组.... 最佳答案 我想(我希望)以下示例可以提供帮助。我将您的MyClass转换为模板类,其中模板参数是数组的维度(12);我希望这不是问题。应该适用于C++11和C++14#includetemplatestructrange{};templatestructrangeH{usingtype=typen

c++ - constexpr 在运行时表现更差

我编写了以下代码来测试constexpr阶乘评估与正常方式相比所花费的时间#include#includeconstexprlongintfactorialC(longintx){returnx*(x(end1-start1).count()(end2-start2).count()当我运行我得到的代码时Nowcallingtheconstexpr1932053504Nowcallingthenormal1932053504Elapsedtimeforconstexpris81812Elapsedtimefornormalis72428但是constexpr应该花费几乎“0”的时间,因

constexpr链接列表 - 从const x*到x*的无效转换

这是我创建一个简单的constexpr链接列表的尝试-structNode{constexprNode(constintn,Nodeconst*next=nullptr):value(n),next(next){}constexprNodepush(constintn)const{returnNode(n,this);}intvalue;Nodeconst*next;};constexprautogetSum(Noden){intsum=0;Node*current=&n;while(current!=nullptr){sum+=current->value;current=current->

c++ - 是否可以在声明后设置 constexpr 数组中元素的值?

是否可以在一处声明一个常量数组(可能是constexpr),然后在另一处定义它,一次定义一个元素?例如externconstexprintmyArray[100];myArray[0]=myConstexprFunction(0);myArray[1]=myConstexprFunction(1);//...myArray[100]=myConstexprFunction(100);我正在尝试做的事情需要这样的东西。也许可以使用类似的东西:http://b.atch.se/posts/constexpr-counter/但是,如果这种技术在下一个C++标准中是非法的(我希望不会),我想