草庐IT

if-constexpr

全部标签

c++ - `constexpr` 变量 "used in its own initializer": Clang vs. GCC

这个问题似乎与anexistingone有关,但我不明白theanswerthere中提供的“可移植解决方法”(涉及constautothis_=this;)而且我认为下面的例子更容易理解。我正在使用以下C++17代码片段(livedemo):#includestructTest{constchar*name_{nullptr};constTest*src_{nullptr};constexprTest(constchar*name)noexcept:name_{name}{}constexprTest(constTest&src)noexcept:src_{&src}{name_=s

c++ - 如何将 boost::lambda 与 std::find_if 一起使用?

我有一个std::vector并且我想检查一个特定的属性每个元素。SomeStruct有一个属性“类型”。我想检查这个属性为Type1或Type2。我的计划是使用boost::lambda。std::vector::const_iteratorit=std::find_if(vec.begin(),vec.end(),_1.type==SomeStruct::Type1||_1.type==SomeStruct::Type2);因为我需要访问每个元素的特定属性,所以我不确定我是否可以完全使用boost::lambda。有什么提示吗? 最佳答案

C++1y/14 : Error handling in constexpr functions?

假设我想编写一个执行整数平方根的C++1y/14constexpr函数:constexprintconstexpr_isqrt(intx);我想执行完整性检查以确保x是非负数:constexprintconstexpr_isqrt(intx){if(x上面的???应该写什么?理想情况下,如果函数是在常量上下文中计算的,它应该会导致编译时错误,如果在运行时调用时会出现运行时错误(例如中止或抛出异常)。 最佳答案 你很幸运,有办法!即使在C++11中!使用异常(exception):#include#includeconstexprin

c++ - 如何在 C++11 constexpr 中检查 double 的位模式是 0x0?

我想检查给定的double/浮点变量是否具有实际位模式0x0。不要问为什么,它用在Qt中的一个函数中(qIsNull()),我希望它是constexpr。原始代码使用了union:union{doubled;int64_ti;}u;u.d=d;returnu.i==0;这当然不能用作constexpr。下一次尝试使用reinterpret_cast:return*reinterpret_cast(&d)==0;但是虽然它在GCC4.7中作为constexpr工作,但它在Clang3.1中失败了(正确地,指针操作的b/c)。最后的想法是去Alexandrescuesque做这个:temp

c++ - constexpr 和 inline 函数可以重新定义吗?

我正在验证C++Primer上的声明:Unlinkeotherfunctions,inlineandconstexprfunctionsmaybedefinedmultipletimesintheprogram.我在下面使用了两个constexprcfunc()的定义,预计foo_0()将调用第一个def而foo_1()将调用2nddef。然而,尝试因编译错误而失败(最后)。为什么?constexprintcfunc(){return42;}intfoo_0(){returncfunc();}constexprintcfunc(){return42;}intfoo_1(){return

C++11 constexpr 函数传递参数

考虑以下代码:staticconstexprintmake_const(constinti){returni;}voidt1(constinti){constexprintii=make_const(i);//erroroccurshere(iisnotaconstantexpression)std::cout为什么我在调用make_const时出错?更新但是这个有效:constexprintt1(constinti){returnmake_const(i);}然而,这不是:templateconstexprbooldo_something(){returni;}constexprin

c++ - constexpr 类的设计 : merging constexpr and non-constexpr versions?

考虑一个在运行时只包装一个值的类:templateclassNonConstValue{public:NonConstValue(constType&val):_value(val){;}Typeget()const{return_value;}voidset(constType&val)const{_value=val;}protected:Type_value;};以及它的constexpr版本:templateclassConstValue{public:constexprConstValue(constType&val):_value(val){;}constexprTypeg

c++ - 如何告诉 static_assert constexpr 函数参数是 const?

我有一个看起来像这样的constexpr函数:constexprintfoo(intbar){static_assert(bar>arbitrary_number,"Usealowernumberplease");returnsomething_const;}但是,用GCC4.6.3编译这个一直告诉我错误:'bar'不能出现在常量表达式中我试过类似的东西constexprintfoo(constexprconstintbar){static_assert(bar>arbitrary_number,"Usealowernumberplease");returnsomething_cons

c++ - 为什么 if constexpr 需要 else 才能工作?

我正在尝试按以下方式使用ifconstexpr:templateclassTrait,typenameFirst,typenameSecond,typename...Rest>constexprboolbinaryTraitAre_impl(){ifconstexpr(sizeof...(Rest)==0){returnTrait{}();}returnTrait{}()andbinaryTraitAre_impl();}示例用例:static_assert(binaryTraitAre_impl());但是编译失败clang:error:nomatchingfunctionforca

c++11 enable_if 错误

我看到了以下C++11的enable_if示例:structis_64_bit{staticconstboolvalue=sizeof(void*)==8;};enable_if::typemy_memcpy(void*target,constvoid*source,size_tn){cout::typemy_memcpy(void*target,constvoid*source,size_tn){cout据我了解,根据系统架构,“my_memcpy”函数将可用于32位或64位版本。但是我在编译时遇到以下错误:error:‘type’in‘structstd::enable_if’do