草庐IT

propagate_const

全部标签

c++ - 可以将互斥锁功能标记为 const

我有代表自定义文档的线程安全Document类。它有getter(const函数)和setter来修改它的状态。所有这些功能都是互斥保护的,以保证文件不会改变直到方法被完全执行。但由于QMutex的使用,我无法标记状态访问函数作为const没有mutable用法。捕获QMutex改变它的状态。这段代码是正确的,还是可以用更好的方式编写?没有hackymutable用法。classDocument{//Thismethodshouldbeconst:itchangesonlymutex//anddon'ttouchdocumentstateboolIsCorrect()const;...

c++ - 通过值可变捕获的 lambda 不适用于 const &?

考虑以下几点:voidtest(constint&value){autotestConstRefMutableCopy=[value]()mutable{value=2;//compileerror:Cannotassigntoavariablecapturedbycopyinanon-mutablelambda};intvalueCopy=value;autotestCopyMutableCopy=[valueCopy]()mutable{valueCopy=2;//compilesOK};}当我将lambda声明为可变并按值捕获value时(我认为是复制了它),为什么第一个版本会出

c++ - 通过值可变捕获的 lambda 不适用于 const &?

考虑以下几点:voidtest(constint&value){autotestConstRefMutableCopy=[value]()mutable{value=2;//compileerror:Cannotassigntoavariablecapturedbycopyinanon-mutablelambda};intvalueCopy=value;autotestCopyMutableCopy=[valueCopy]()mutable{valueCopy=2;//compilesOK};}当我将lambda声明为可变并按值捕获value时(我认为是复制了它),为什么第一个版本会出

c++ - 为什么 const 变量必须立即初始化?

这是一个通用的编程问题。我正在学习C++,并且了解到任何const变量,即:constinti或int*constptr,都必须立即初始化。这也是地址引用必须立即初始化的根本原因,因为地址是const。但我找不到必须这样做的原因/为什么要强制执行此规则。谁能帮我解释一下? 最佳答案 因为您无法在以后对其进行初始化或赋值。constintsize;//noinitialization(error)size=100;//error-youcannotassignaconstvariable.现在,如果一个变量既没有任何有意义的值,也因为

c++ - 为什么 const 变量必须立即初始化?

这是一个通用的编程问题。我正在学习C++,并且了解到任何const变量,即:constinti或int*constptr,都必须立即初始化。这也是地址引用必须立即初始化的根本原因,因为地址是const。但我找不到必须这样做的原因/为什么要强制执行此规则。谁能帮我解释一下? 最佳答案 因为您无法在以后对其进行初始化或赋值。constintsize;//noinitialization(error)size=100;//error-youcannotassignaconstvariable.现在,如果一个变量既没有任何有意义的值,也因为

c++ - 基于范围的隐式添加 `const` 限定符?

让我们看看下面这个简单的基于范围的for循环:inta=5,b=6;for(auto&i:{a,b}){std::coutgcc提示assignmentofread-onlyreference'i',暗示与初始化列表一起使用的基于范围的for循环隐式添加了const限定引用,完全无端。为什么会这样?是否有一种变通方法允许在基于for循环的范围内修改变量? 最佳答案 在inta=5,b=6;for(auto&i:{a,b})你有那个{a,b}是std::initialiser_list两个元素,a和b,其中a的值和b被复制。现在,st

c++ - 基于范围的隐式添加 `const` 限定符?

让我们看看下面这个简单的基于范围的for循环:inta=5,b=6;for(auto&i:{a,b}){std::coutgcc提示assignmentofread-onlyreference'i',暗示与初始化列表一起使用的基于范围的for循环隐式添加了const限定引用,完全无端。为什么会这样?是否有一种变通方法允许在基于for循环的范围内修改变量? 最佳答案 在inta=5,b=6;for(auto&i:{a,b})你有那个{a,b}是std::initialiser_list两个元素,a和b,其中a的值和b被复制。现在,st

c++ - const 成员函数的语义是什么?

我知道该函数不允许更改对象的状态,但我想我在某处读到允许编译器假设如果使用相同的参数调用该函数,它将返回相同的值并且因此可以重用缓存的值(如果可用)。例如classobject{intget_value(intn)const{...}...objectx;inta=x.get_value(1);...intb=x.get_value(1);然后编译器可以优化第二次调用并使用寄存器中的值或简单地执行b=a;这是真的吗? 最佳答案 const是关于程序语义而不是关于实现细节。当成员函数const不改变对象的可见状态时,您应该标记它,并且

c++ - const 成员函数的语义是什么?

我知道该函数不允许更改对象的状态,但我想我在某处读到允许编译器假设如果使用相同的参数调用该函数,它将返回相同的值并且因此可以重用缓存的值(如果可用)。例如classobject{intget_value(intn)const{...}...objectx;inta=x.get_value(1);...intb=x.get_value(1);然后编译器可以优化第二次调用并使用寄存器中的值或简单地执行b=a;这是真的吗? 最佳答案 const是关于程序语义而不是关于实现细节。当成员函数const不改变对象的可见状态时,您应该标记它,并且

c++ - 通过非常量指针修改 const

我对以下代码中发生的事情有点困惑:constinte=2;int*w=(int*)&e;//(1)casttoremoveconst-ness*w=5;//(2)cout在(1)中,w指向e的地址。在(2)中,该值更改为5。但是,当显示*w和e的值时,它们的值不同。但是如果你打印w指针和&e的值,它们的值/地址是相同的。为什么e仍然包含2,即使它已更改为5?它们是否存储在单独的位置?还是临时的?但是w指向的值怎么还是e的地址呢? 最佳答案 正如我在评论中所说,一旦你修改了const值,你就处于未定义的行为状态,所以谈论正在发生的事情