可变函子是否仍"valid"使用
Is mutable functor still "valid" to be used
看完你不知道const和mutable我有点困惑如何正确处理mutable
在未来。虽然我认为const
的情况非常安全,因为默认情况下会假设物理只读(减去旧的逻辑异常),但正确处理mutable
令我困惑。例如,对于新的threadsafe-condition,下面的语句似乎是错误的:
int main() {
int n;
[=]() mutable {n = 10;}();
return n;
}
我认为,在这种情况下,n
必须包装成std::atomic
或n
的副本以另一种方式受并发写保护!?
如果我们明确地将lambda写出来,您可能会更清楚:
struct mylambda
{
mylambda(int n) : n(n) {}
void operator()() /* const <- lambda specified as mutable, operator not const */
{
n = 10;
}
private:
int n;
};
int main() {
int n = 0;
mylambda(n)();
return n;
}
(旁注:你实际上在你的例子中有未定义的行为,因为当你的lambda复制n
,它是从一个未初始化的变量读取。我已经在这里初始化它来修复这个小错误。
正如你所看到的,你没有可变成员,所以没有什么需要改变是线程安全的(根据谈话)。只是一个普通的成员变量,可以通过非const成员函数进行更改;非const成员函数不被认为是线程安全的。
我不知道你是否可以将lambda成员标记为mutable
;如果可以的话,您可能处于一个关注线程安全的位置(加上const函数调用操作符)。但我认为这是不可能的。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- C++:TypeDef使用元组
- 使用std::multimap迭代器创建std::list
- 从不同线程使用int64的不同字节安全吗
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么在全局范围内使用"extern int a"似乎不行?
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用Google Mock来模拟gettimeofday()
- 如何使用默认参数等选择模板专业化
- 为什么使用 "this" 指针调用派生成员函数?
- 使用新行和不使用新行读取文件
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 如何确定我已使用非编码文件到达 EOF?
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 使用CMake创建QML插件
- 使用strcpy将char数组的元素复制到另一个数组
- 在c++中使用nlohmann从类到json的转换
- 在 Unity 中使用 x64 c++ dll 可以"Is not a valid Win32 application error"
- 可变函子是否仍"valid"使用