我在Quora上看到在C++中将引用变量声明为常量.staticconstexprconstint&r=3;那么,为什么constexpr和const都用在一个语句中?这种声明的目的是什么? 最佳答案 const变量是在初始化后不能修改的变量(例如constinta=1)。constexpr变量是constantexpressions并且可以在编译时使用。将constexpr用于变量声明意味着const。但是,在此声明中,const适用于int,而constexpr适用于constint&(对constint的引用).
在ScottMeyers的“EffectiveModernC++”中,他给出了以下函数来查找数组的大小:templateconstexprstd::size_tarraySize(T(&)[N])noexcept{returnN;}这里'noexcept'的目的是什么?据我了解,noexcept仅影响运行时代码的生成-但我看不到任何可以在运行时而不是编译时调用此函数的情况? 最佳答案 在一般情况下,标记为constexpr的模板在实例化时可能会失去该状态。如果一组特定的模板参数不允许,则该限定将被静默删除,并且生成的函数是一个“常规
我试图完全理解ifconstexpr。我明白,如果ifconstexpr(expr)在模板中使用,并且expr依赖于模板参数,那么在实例化期间,只有一个then/else分支会被实例化,其他的会被丢弃。我有两个问题:如果expr不依赖于模板参数,那么ifconstexpr(expr)的分支不会被丢弃,这是真的吗?如果是,标准在哪里这样说?我看不出标准在哪里有异常(exception),只有当expr依赖时才会发生丢弃。ifconstexpr在模板之外有用吗?如果是,这有哪些用例?你能举一些例子来理解它的用处吗? 最佳答案 Isitt
标题说明了一切,两种常用方法都行不通。我错过了什么?1.classCl{staticconstexprdoublePI;};constexprdoubleCl::PI=3.14;(26):errorC2737:'private:staticdoubleconstCl::PI':'constexpr'objectmustbeinitialized2.classCl{staticconstexprdoublePI=3.14;};(26):errorC2864:'Cl::PI':astaticdatamemberwithanin-classinitializermusthavenon-vol
我对这些说明符感到非常沮丧,因为我理解它们单独使用时的作用,但我发现当它们一起使用时很难理解。例如,野外的一些代码包含-namespace{staticconstexprcharconst*Hello[]={"HelloString","WorldString"};...}这到底有什么用?既然已经在匿名命名空间中,为什么还要使用static。静态内部类是有意义的(除非你正在编写缺少namespace的C),没有类-为什么??为什么使用constexpr-没有理由在这里使用它。一个简单的const就不行吗?然后const*Hello对我来说没有意义。这里不变的是什么?字符串或指针*Hel
有一个类似的问题here但它没有有值(value)的信息,所以我想再问一次-是否可以使用constexpr加载任意文件的内容?功能?我知道这似乎是不可能的,因为所有允许文件I/O(fopen、open...)的可能函数都不是constexpr所以在这种情况下不能被调用。然而——由于这里有很多人关注c++17及以后的开发——是否有任何希望进一步的标准将包括一些文件I/OAPI,即constexpr并且可以用于在编译时加载文件?只是为了比较-Haxe允许通过编译时宏做几乎任何事情,所以在C++中有类似的东西会非常酷。例如,通过反序列化文件生成类实例。 最佳答案
我试图在编译时静态实例化一些对象。我需要的是为成员int变量设置一个增量值。例如,我创建的第一个对象的值为0,第二个为1,第三个为2...总结一下,我需要这样的东西,但它必须像constexpr一样工作。//headerclassMyClassfinal{private:staticintIDcount;public:constintID;constexprMyClass(args);//~MyClass();};//sourceintMyClass::IDcount=0;constexprMyClass::MyClass(args):ID(MyClass::IDcount++){}有
下面的代码#includevoidfoo(conststd::array&a){constexprsize_tS=a.size();}intmain(){}在GCC中编译正常,但在clang中编译失败并出现以下错误消息main.cpp:5:28:error:constexprvariable'S'mustbeinitializedbyaconstantexpressionconstexprsize_tS=a.size();^~~~~~~~与此同时,许多关于SO上的constexpr问题的帖子似乎暗示clang通常对constexpr有更好的(更迂腐?)支持。那么,在这种情况下哪个编译器
更新:我在下面发布了我自己的答案这里有一个更长的版本:http://scrupulousabstractions.tumblr.com/post/38460349771/c-11-type-safe-use-of-integer-user-defined-literals问题:我制作了一个简单的constexpr用户定义文字_X获取值作为unsignedlonglong(这就是数字用户定义文字的工作方式:http://en.cppreference.com/w/cpp/language/user_literal),然后我确保该值适合signedlonglong。一切正常(太大的值会导致
我已经编写了以下代码来测试跨函数调用的noexcept传播,它似乎并没有像我想象的那样工作。在GCC4.7.2中,可以有效地测试函数是否为noexcept仅直接或作为模板特化参数传递时;但不是当作为参数传递给模板函数时,或作为指向普通函数的函数指针时——即使该函数将其形式参数声明为noexcept。这是代码:#include#definetest(f)\std::coutstaticinlinevoidtest0(){test(f);}templatestaticinlinevoidtest1(Ff){test(f);}staticinlinevoidtest2(void(*f)())