草庐IT

constness

全部标签

c++ - 为什么要使用 const 进行隐式转换?

广泛阅读ISO/IEC14882,Programminglanguage–C++我仍然不确定为什么需要const隐式转换为具有单个参数构造函数的用户定义类型,如下所示#includeclassX{public:X(intvalue){printf("constructorinitializedwith%i",value);}}voidimplicit_conversion_func(constX&value){//produces"constructorinitializedwith99"}intmain(intargc,char*constargv[]){implicit_conve

c++ - 理解 "const"在声明中的位置

我在为C和C++语言的声明中使用const的方式找到直观的模式时遇到了麻烦。以下是一些示例:constinta;//Constintegerintconsta;//Constintegerconstint*a;//Pointertoconstantintegerint*consta;//Constpointertoanintegerintconst*aconst;//Constpointertoaconstinteger在第1行和第2行中,似乎const可以出现在int之前或之后,这是它所修改的。那么,在第4行,编译器如何确定const正在修改*(指针)而不是int?编译器遵循什么规则

c++ - 在 C++17 中,为什么关联容器有一个 `erase` 成员函数(非 -`const` ) `iterator` ?

见,例如,http://en.cppreference.com/w/cpp/container/map/erase在C++03中有三个重载:voiderase(iteratorpos);voiderase(iteratorfirst,iteratorlast);size_typeerase(constkey_type&key);在C++11中,第一个和第二个重载被更改为采用const_iterator以便可以使用iterator或const_iterator调用它们>。第一个重载也得到了改进,它让迭代器在删除后将迭代器返回到元素:iteratorerase(const_iterator

c++ - 接受通用引用并返回 const 引用的函数的莫名行为

我一直认为下面这个接受通用引用的函数必须返回一个const-reference。templateconstT&Const(T&&val){returnval;}但是,以下代码使用VSC++和gcc编译成功:intx=5;Const(x)=6;运行后变量x的值等于6。因此,Const函数返回一个非常量引用。要获得编译器错误,必须修改函数Const以接受传统的左值引用或声明为返回conststd::remove_reference_t&.这是为什么呢?我错过了什么规则?提前致谢! 最佳答案 anuniversalreference不,它

C++ const 成员函数正在修改成员变量

今天我发现这样的代码有效。这对我来说听起来很奇怪,因为据我所知,你不能从const成员函数中修改任何成员。你实际上不能直接这样做,但你可以调用非常量成员函数。如果将成员函数标记为const表示传递给函数的这个指针指向的是const对象,那么在下面的示例中如何调用非const成员函数?#includeclassX{public:voidfoo()const{ptr->bar();}voidbar(){}private:X*ptr;};intmain(){} 最佳答案 你的成员变量不是X,而是指向X的指针。只要foo不修改指针,就可以是

c++ - 我应该通过 const 引用传递一个 lambda。

当接受lambda作为函数的参数时,我通常使用以下模式(按值传递的模板类):templatevoidhigherOrderFunction(Functionf){f();}这是否复制(关闭)参数?如果是这样,那么通过const引用接受lambda有什么问题吗?templatevoidhigherOrderFunction(constFunction&f){f();}一个简单的测试似乎表明这工作正常,但我想知道是否有任何我应该注意的特殊注意事项。 最佳答案 如果您通过值传递,您将复制闭包对象(假设您没有定义内联lambda,在这种情况

c++ - 命名空间范围内的 const 变量不是隐式静态的吗?

我知道命名空间范围内的staticconstintx=42;等价于constintx=42;因为const变量是隐式static(必须将它们声明为extern才能获得外部链接)。每个包含此声明的翻译单元都会获得x的本地拷贝。这是否仅适用于某些(可能是整数?)类型?我在头文件中有以下代码:namespaceXXX{staticconstchar*A="A";staticconstchar*B="B";staticconstchar*C="C";//andsoon}(请不要评论为什么我不应该使用C风格的字符串——这是遗留代码)这个头文件包含在几个源文件中,一切都很好(每个编译单元都有自己的

c++ - 在 C++ 中将 std::wstring 转换为 const *char

如何在C++中将std::wstring转换为const*char? 最佳答案 您可以使用c_str成员函数将std::wstring转换为constwchar_t*:std::wstringwStr;constwchar_t*str=wStr.c_str();然而,转换成constchar*并不自然:它需要额外调用std::wcstombs,例如:#include//...std::wstringwStr;constwchar_t*input=wStr.c_str();//Countrequiredbuffersize(pluso

c++ - 如何使用 libclang 确定成员函数是 const 还是 volatile?

我有一个类型为CXCursor_CXXMethod的CXCursor实例。我想知道函数是const还是volatile,例如:classFoo{public:voidbar()const;voidbaz()volatile;voidqux()constvolatile;};我在libclang的文档中找不到任何有用的东西。我尝试了clang_isConstQualifiedType和clang_isVolatileQualifiedType但这些似乎总是在C++成员函数类型上返回0。 最佳答案 我可以想到两种方法:使用libclan

c++ - 如何在我的程序中找到 "const char* + int"表达式

我正在进行源代码迁移,转换器程序没有将嵌入字符串的串联转换为整数。现在我有很多带有这种表达式的代码:f("sometext"+i);由于C/C++会将其解释为数组下标,因此f将接收"sometext"或"ometext",或“我的文字”...我的源语言将字符串与int的串联转换为字符串串联。现在我需要逐行浏览源代码并手动将前面的表达式更改为:f("sometext"+std::to_string(i));转换程序设法将本地“String”变量转换为“std::string”,得到表达式:std::stringsome_str=...;inti=...;f(some_str+i);这些很