草庐IT

constexpr-ness

全部标签

c++ - 数组的 constexpr 初始化以对内容进行排序

这有点像一个谜而不是一个现实世界的问题,但我已经遇到了这样一种情况,我希望能够编写一些行为完全相同的东西templatestructSortMyElements{intdata[N];templateSortMyElements(TT...tt):data{tt...}{std::sort(data,data+N);}};intmain(){SortMyElementsse(1,4,2,5,3);intse_reference[5]={1,2,3,4,5};assert(memcmp(se.data,se_reference,sizeofse.data)==0);}除了我想要SortM

c++ - 通过显式转换函数初始化枚举类类型的静态 constexpr 类成员

我在g++4.8.1和clang++3.4的行为之间存在差异。我有一个A类,它是文字类型的,它有一个explicitconstexpr转换函数来输入enumclassE.Gcc允许我在某些情况下使用转换函数从A类型的常量表达式初始化constexpr类型的E变量,但是不是当变量是静态类成员时(下面的e2)Clang拒绝所有上下文中的初始化(e1、e2和e3)。根据[over.match.conv]p1,在这里可以使用显式转换函数enumclassE{e};structA{explicitconstexproperatorconstE()constnoexcept{returnE::e;

c++ - 声明 constexpr 函数或方法

我想知道是否对必须声明constexpr函数和方法的位置有任何限制,就像内联函数和方法一样。我知道内联函数或方法必须写在头文件中,以便编译器可以在调用它们的地方访问它们的定义。如果constexpr有类似的东西,那将是有道理的,但我无法在这一点上找到任何东西......所以基本上我的问题是:我能否在头文件中编写constexpr函数的定义而不冒重复符号的风险?我可以将constexpr函数或方法的声明和定义分开吗? 最佳答案 您定义constexpr函数的位置会影响您如何使用它。特别是:C++14[expr.const]p2:Aco

c++ - 是否可以使用 `constexpr` 模板变量作为正式模板参数的默认值

使用clang3.6.0,我无法编译以下代码示例。#includetemplateconstexprboolIS_SCALAR=::std::is_scalar::value;template>structClass_Breaks{};template::value>structClass_Works{};voidfunction(){Class_Breaksbreak_error;Class_Breaks>breaks_ok;Class_Worksok;}但是,返回以下错误消息:1>[66%]BuildingCXXobjectCMakeFiles/Core.dir/tests.cpp

c++ - 不使用这个的 constexpr 成员函数?

请考虑以下两个C++14程序:程序1:structS{constexprintf()const{return42;}};Ss;intmain(){constexprintx=s.f();returnx;}程序2:structS{constexprintf()const{return42;}};intg(Ss){constexprintx=s.f();returnx;}intmain(){Ss;returng(s);}这些程序中的一个或两个都不是良构的吗?为什么/为什么不? 最佳答案 这两个程序都是良构的。C++14标准要求s.f()

c++ - decltype(foo(1)) 应该实例化 constexpr 函数模板 foo 吗?

以下代码使用gcc和MSVC编译,但使用clang失败,我使用clang-3.5和当前主干进行了测试。templateconstexprautowrong=false;templateconstexprautofoo(constTt)->int{static_assert(wrong,"");return{};}usingF=decltype(foo(1));intmain(){}clang实例化函数体并偶然发现static_assert。gcc和MSVC只看函数声明,忽略函数体中的static_assert。如果删除constexpr,所有编译器都能正常编译代码。问题:如果声明了返回

c++ - 函数参数的 MSVC 和 constexpr?

这段代码用clang和gcc编译得很好。templatestructN{staticconstexprsize_tv=n;};templateconstexprbooloperator,size_tn2){returnnconstexprvoidfoo(Nv){static_assert(v{});return0;}但是,如果我使用MSVC,我得到的错误是v不是常量表达式。我能理解为什么MSVC这么认为,但我认为这是错误的,而clang/gcc是正确的。是MSVC的错误吗? 最佳答案 是的,MSVC在这里是错误的。代码格式良好似乎违

c++ - constexpr 上下文中的 std::optional 赋值运算符

我在std::optional上摸不着头脑,根据thedocs,不应有constexpr赋值运算符。但是,当我在gcc-8.1中尝试这个片段时,它编译并工作得很好:constexprstd::optionalfoo(){std::optionalbar=3;bar=1337;returnbar;}constexprautoz=foo();有什么我想念的吗? 最佳答案 这似乎是gcc中的一个错误。我刚刚在clang-6.0中尝试过,编译失败并出现预期错误。此外,该标准没有提及赋值运算符的任何constexpr重载,因此我会将此错误报告

c++ - 使用 move ctor 的 constexpr 对象的 constexpr 数组

我有一个带有constexpr值构造函数的类,但没有复制或移动构造函数classC{public:constexprC(int){}C(constC&)=delete;C&operator=(constC&)=delete;};intmain(){constexprCarr[]={1,2};}我发现这段代码不起作用,因为它实际上是在尝试使用C的移动构造函数而不是值构造函数来就地构造。一个问题是我希望此对象不可移动(出于测试目的),但我想“好吧,好吧,我将添加一个移动构造函数。”classC{public:constexprC(int){}C(constC&)=delete;C&oper

C++14:从参数值初始化 constexpr 变量

假设我有一个类可以通过constexpr函数返回常量表达式:templatestructFoo{constexprintBar()const{returnN;}};如果我想从Foo::Bar()初始化constexpr值,我应该如何传递类型为Foo的参数?我已经尝试了这两个,每个示例中都有一个constexpr变量来测试它是否可以被初始化:templateconstexprintByValue(Foof){constexprinti=f.Bar();returnf.Bar();}templateconstexprintByReference(constFoo&f){constexpri