草庐IT

add_const

全部标签

c++ - 线程安全和 `const`

const(指针、引用和成员函数)如何帮助C++中的线程安全? 最佳答案 任何不可变(即不可更改)的数据本质上都是线程安全的-多个线程并发读取相同的只读数据没有风险,因为它永远不会更改!在C++中将变量标记为const使其成为只读的,因此是线程安全的。 关于c++-线程安全和`const`,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/362260/

c++ - 知道为什么 QHash 和 QMap 返回 const T 而不是 const T& 吗?

与std::map和std::hash_map不同,Qt中的相应版本不需要返回引用。如果我为相当庞大的类构建哈希,效率不是很低吗?编辑特别是因为有一个单独的方法value(),它可以按值返回它。 最佳答案 STL的常量下标运算符|容器可以返回一个常量引用,因为它们会拒绝使用容器中不存在的索引调用它。这种情况下的行为是未定义的。因此,作为明智的设计选择,std::map甚至不提供const下标运算符重载。QMap试图更加适应,提供一个const下标运算符重载作为语法糖,遇到不存在键的问题,再次尝试更加适应,并返回一个默认构造的值。如果

c++ - const 函数中的成员分配

我有一个类成员myMember,它是一个myType指针。我想在声明为const的函数中分配此成员。我正在做如下:voidfunc()const{...const_cast(myMember)=newmyType();...}这样做在VC++中工作正常,但GCC会给出错误消息“左值需要作为赋值的左操作数”。使成员可变允许我简单地删除const_cast并分配值。但是,我不完全确定这会带来其他副作用。我可以在不必使成员可变的情况下分配我的成员吗?如何?使成员可变有任何副作用吗? 最佳答案 这种情况——封装的内部状态变化不会影响外部状态

c++ - 通过 const ref 传递整数类型有什么好处

问题:通过const引用而不是简单地通过值传递整数类型是否有好处。即。voidfoo(constint&n);//case#1对比voidfoo(intn);//case#2对于用户定义的类型,答案很明确,案例#1避免了不必要的复制,同时确保了对象的常量性。但是在上面的例子中,引用和整数(至少在我的系统上)是相同的大小,所以我无法想象函数调用需要多长时间(由于复制)。但是,我的问题确实与内联函数的编译器有关:对于非常小的内联函数,编译器是否必须在情况#2中复制整数?通过让编译器知道我们不会更改引用,它可以内联函数调用而无需不必要地复制整数吗?欢迎提出任何建议。

c++ - const关键字在c中是如何工作的

我想了解c和c++中的const内部结构。编译器如何强加恒定性?有人可以帮帮我吗? 最佳答案 一般来说,const是100%的编译器。当您声明某些内容为const时,编译器会对允许您编写的内容施加限制。它不会让您分配给const标量,通过const引用或指针分配,或调用const对象的非const函数。不保证编译器会安排任何类型的运行时保护。 关于c++-const关键字在c中是如何工作的,我们在StackOverflow上找到一个类似的问题: https:/

C++ "error: passing ' const std::map<int, std::basic_string<char>>' as ' this' argument of ..."

使用以下代码(为简洁起见摘录):颜色.h:classcolor{public:color();enumcolorType{black,blue,green,cyan,red,magenta,brown,lightgray,nocolor};colorTypegetColorType();voidsetColorType(colorTypecColortype);stringgetColorText()const;private:colorTypecColortype=nocolor;mapcolors={{black,"black"},{blue,"blue"},{green,"gre

c++ - 有没有办法使用独立的 `std::begin` 和 const_iterator?

我喜欢一致性。我最近问了使用std::begin的问题与例如std::vector::begin,并且一致的决定似乎是使用前者,因为它更通用。但我想我在泥泞中找到了一根棍子。有时,您想传达在循环遍历容器时不会更改容器,因此调用std::vector::cbegin.如果您有时这样做会使您的代码非常不对称iter=v.cbegin()其他时候做了iter=begin(v).有没有办法解决这种不对称的问题,您是否仍会推荐std::begin鉴于这些知识?为什么C++没有std::cbegin? 最佳答案 C++14有cbegin/cen

c++ - 是否可以在 "const"函数中更改成员变量的值?

常量变量的值可以通过指针技巧改变,但是否可以这样做:classA(){intx;public:voidfunc()const{//changevalueofxhere}} 最佳答案 声明x可变classA(){mutableintx;public:voidfunc()const{//changevalueofxhere}}; 关于c++-是否可以在"const"函数中更改成员变量的值?,我们在StackOverflow上找到一个类似的问题: https://s

c++ - 返回 const 引用是否更有效

例如其中最好的是:std::stringf(){}或conststd::string&f(){} 最佳答案 函数不应返回对局部对象/变量的引用,因为此类对象超出范围并在函数返回时被销毁。不同的是,函数可以返回一个对象的常量或非常量引用,其范围不受函数上下文的限制。典型的例子是自定义operator:std::ostream&operator不幸的是,按值返回有其性能缺陷。正如Chris提到的,按值返回对象涉及临时对象的拷贝及其后续销毁。复制通过复制构造函数或operator=进行。.为了避免这些低效率,智能编译器可能会应用RVO或N

c++ - 自动生成成员函数的 const 重载

我正在尝试在C++中实现D语言关键字inout的语义(只是为了好玩)。根据上下文,它基本上表示以下两种情况之一:“此函数的结果将与其参数之一具有相同的常量性。”“此成员函数的结果将与您调用它的实例具有相同的常量性。”在编写诸如begin和end等成员函数时非常有用。我能够相对轻松地创建第一种情况的有效实现(尽管界面确实不漂亮):http://ideone.com/wgaDJJ然而,根据我的最佳猜测,第二个似乎是不可能的。你只能在使用模板时获得这种“自动const重载生成”,但据我所知,你不能在“this”参数上进行模板化。特别是,您会注意到此代码不工作/编译:http://ideone