草庐IT

const_assert

全部标签

c++ - 迭代容器或范围 - constness 问题

我正在尝试编写一个模板函数,它将汇总某个集合的所有元素——指定为普通STL容器,或指定为ranges-v3的范围。(实际功能,如下所示更通用一些)我认为这会起作用:templatestd::pairsum(constRange&range,Retzero,Funcextract){usingIt=decltype(range.begin());Retsum=zero;intnumElements=0;for(Itit=range.begin();it!=range.end();++it){sum+=extract(*it);++numElements;}return{sum,numEl

c++ - const 将公共(public)成员引用到私有(private)类成员 - 为什么它有效?

最近,我发现了一个有趣的讨论,讨论如何在不使用多个getter混淆设计的情况下允许对私有(private)成员进行只读访问,其中一个建议就是这样做:#includeclassA{public:A():_ro_val(_val){}voiddoSomething(intsome_val){_val=10*some_val;}constint&_ro_val;private:int_val;};intmain(){Aa_instance;std::cout输出:$./a.out0130GotW#66明确指出对象的生命周期开始whenitsconstructorcompletessucces

c++ - 关于 const 禁止的重言式比较的警告?

以下代码在GCC和Clang上生成警告:intmain(){unsignedn=0;return(n警告是:$g++-4.7-std=c++11-O3-Wall-Wextrat.cc-ott.cc:Infunction‘intmain()’:t.cc:3:16:warning:comparisonofunsignedexpression到目前为止,还不错。现在我将变量更改为const:intmain(){constunsignedn=0;return(n而且两个编译器突然很乐意在没有警告的情况下编译代码:$g++-4.7-std=c++11-O3-Wall-Wextrat.cc-ot$

c++ - 通过重新使用的非 `const` 名称修改动态分配的 -`const` 对象是否合法?

考虑以下程序:#includeintmain(){intx=0;constint*px=new(&x)constint(0);x=1;std::cout它compilesunderGCC4.8(并产生“预期的”输出),但我怀疑它完全是UB,因为动态对象的类型为constint(whichremainspartofthetype)。但是,如果是的话,为什么编译器不阻止我违反const-correctness? 最佳答案 tl;dr:是的,这是未定义的行为。不,编译器不会对其进行诊断。一般来说,编译器不会(有时不能)诊断UB。const

c++ - static, constexpr, const - 它们一起使用时是什么意思?

我对这些说明符感到非常沮丧,因为我理解它们单独使用时的作用,但我发现当它们一起使用时很难理解。例如,野外的一些代码包含-namespace{staticconstexprcharconst*Hello[]={"HelloString","WorldString"};...}这到底有什么用?既然已经在匿名命名空间中,为什么还要使用static。静态内部类是有意义的(除非你正在编写缺少namespace的C),没有类-为什么??为什么使用constexpr-没有理由在这里使用它。一个简单的const就不行吗?然后const*Hello对我来说没有意义。这里不变的是什么?字符串或指针*Hel

c++ - 带有 static_assert 的漂亮 sfinae

我正在尝试创建一个事件管理器来注册接收者。为此,我希望能够构造一个具有给定参数的std::function。但是,我希望最终用户能够轻松理解该错误。我考虑过使用SFINAE和依赖于类型的static_assert来执行此操作,但我遇到了麻烦,因为这两个函数在有效输入上变得不明确。此外,我希望用户可以收到多个错误原因。由于有两个失败点(提供无效的仿函数和提供错误的事件类型),我希望总共有3个函数,第一个是正确输入的函数,然后是不正确的输入(而不是有4个函数用于每个状态的组合)。这可以用c++17的ifconstexpr解决,但我的目标平台是c++14,所以需要使用其他方法。我目前的尝试(

c++ - 如何将单字节 const char* 转换为 UTF-8 编码

我有一个函数,它要求我传递一个由char*指向的UTF-8字符串,并且我有一个指向单字节字符串的char指针。如何在C++中将字符串转换为UTF-8编码?我可以使用任何代码来执行此操作吗?谢谢! 最佳答案 假设是Linux,您正在寻找iconv.当您打开转换器(iconv_open)时,您将传递from和to编码。如果您将空字符串作为from传递,它将从您系统上使用的应该与文件系统匹配的语言环境转换而来。在Windows上,您与MultiByteToWideChar几乎相同您将CP_ACP作为代码页传递的位置。但在Windows上,

c++ - 按值传递还是 const 引用?

这个问题在这里已经有了答案:Arethedaysofpassingconststd::string&asaparameterover?(13个答案)关闭9年前。有asetofgoodrulestodeterminewhetherpassbyvalueorconstreference如果函数打算改变参数作为副作用,取它通过非常量引用。如果函数不修改它的参数并且参数是原始类型,按值取值。否则按const引用取,以下情况除外案例:如果函数需要复制const无论如何引用,按值(value)接受。构造函数如下,如何确定?classA{public:A(stringstr):mStr(str){}

c++ - 如何移动一个 const 返回的对象?

最近,我一直在阅读thispost和thatpost建议停止返回const对象。此建议也由StephanT.Lavavej在histalk中给出在2013年的GoingNative中。我写了一个非常简单的测试来帮助我理解在所有这些情况下调用了哪个构造函数/运算符:返回const或非const对象如果启动返回值优化(RVO)会怎样?如果启用命名返回值优化(NRVO)会怎样?这是测试:#includevoidprintln(conststd::string&s){try{std::cout这是Release模式下的输出(使用NRVO和RVO):buildaDefaultConstructo

c++ - 如何将类型的名称作为字符串嵌入到 static_assert() 中?

这个问题在这里已经有了答案:Integratetypenameinstatic_assertoutput?(4个答案)关闭8年前。问题以下内容不会生成,因为消息不是字符串文字。templatestructFoo{Foo(){static_assert(is_pod::value,typeid(T).name());}};最终,如果我尝试编译Foofb;,我想要一条失败消息,如“Barmustbeapod-type”.是否可以按照static_assert的要求在编译期间构建此字符串?