草庐IT

SOME_CONST

全部标签

c++ - VC++ 允许对 STL 容器使用 const 类型。为什么?

STL容器要求存储的值是可复制构造和可分配的。constT显然不是任何T的可分配类型,但我尝试使用它(只是好奇)并发现它可以编译,而且表现得像可分配类型。vectorv(1);v[0]=17;这在VisualStudio2008中成功运行并将v[0]分配给17。 最佳答案 这不是其他人建议的实现中的错误。违反C++标准库设施的要求不会使您的程序格式错误,它会产生未定义的行为。您违反了存储在容器中的值类型必须是可复制构造和可分配的要求(显然,const类型不可分配),因此您的程序表现出未定义的行为。C++标准中适用的语言可以在C++0

c++ - const-ness 作为模板参数

我有两个结构://-----non-const-----structarg_adapter{EArgTypetype;//fmtA,fmtB,...union{TypeA*valueA;TypeB*valueB;//...moretypes}arg_adapter(TypeA&value):type(fmtA),valueA(&value){}arg_adapter(TypeB&value):type(fmtB),valueB(&value){}//...}//-----constversion-----structconst_arg_adapter{EArgTypetype;//fm

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