作者lovejomi (JOMI)
看板C_and_CPP
标题[问题] 透过copy elision 来return by value
时间Tue Sep 1 11:36:12 2020
标题不好下
主要问题是
一个class被标注 copy constructor = delete的时候
我却透过by value的语意 使用他
具体code
我用lock_guard<...>来举例
https://wandbox.org/permlink/kNmQm9tWjXAJEbVH
看到不少code, 有人这样使用
lock_guard<mutex> getLock(){return lock_guard<mutex>{m};}
这种code 贴到ideone C++14就不给过
两个问题
1. 因为C++17 copy elision, 这种使用方式 是完全没问题的吗?
2. 假设没问题, 因为只有C++17後才能这样写, 我自己会觉得宁可不要写这种 code
尽量维持 backward compatible.
3. 如果好的包法 要怎麽做呢?
以前通常是把get set包出去 内部用lock去r/w member
struct
{
void GetX(){ lock_guard...}
void SetX(...){lock_guard....}
private:
int x;
mutex m;
}
但这样变成 要提供get/set...
所以我猜才会有人想要提供一个RAII Locker的getter
让外面先acquire lock 直接把member public出去给外面操作
该怎麽做比较好呢?
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 39.12.30.36 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1598931374.A.FDE.html
2F:→ Lipraxde: 提供 lock、unlock 09/01 12:20
3F:→ Lipraxde: 是说 getLock 这样写好怪,有连结可以让我观摩一下吗? 09/01 12:21
4F:→ lovejomi: 没有连结耶 内部的code 不只一个人这样写 @@ 09/01 12:30
5F:→ Lipraxde: 可能第一个人写下去後後面的接着抄吧... 09/01 18:18
6F:→ lovejomi: 也许是这样 但我是想探讨 这种方式是否没任何问题,如果 09/01 19:40
7F:→ lovejomi: 没有 这感觉很钻漏洞的感觉 09/01 19:40
8F:→ Lipraxde: 我是觉得不行啦,写这种意图怪怪的 code... 09/01 20:50
9F:→ loveme00835: 你先想写类别的目的是什麽? 是提供抽象化. 而 mutex 09/02 00:04
10F:→ loveme00835: 目的就是要确保抽象化有被达成, 具体来说就是物件的 09/02 00:05
11F:→ loveme00835: 状态改变不会有意外发生. 你为了 mutex 反而增加和类 09/02 00:06
12F:→ loveme00835: 别责任无关的方法, 你同事都不会觉得奇怪吗? 一般有 09/02 00:07
13F:→ loveme00835: mutex 也会经过封装, 让使用者传入 callback 来间接 09/02 00:09
14F:→ loveme00835: 存取物件, 实作可以参考 boost::with_lock_guard(), 09/02 00:10
15F:→ loveme00835: 多做一层封装在之後确定存取都在同一个 thread 之後 09/02 00:35
16F:→ loveme00835: 也可以直接把 mutex 拿掉, client code 不需要做调整 09/02 00:35
17F:→ loveme00835: 所以你会看到有些函式库进 critical section 是给 09/02 00:37
18F:→ loveme00835: callback 而不是明确地写 lock 叙述 09/02 00:37
20F:→ loveme00835: 当你在传东西给 callback 的时候, 最好是用限缩後的 09/02 00:46
21F:→ loveme00835: 介面, 看是要用 std::forward_as_tuple() 或是允取存 09/02 00:48
22F:→ loveme00835: 取的成员放在 base class 内, 再怎麽样都不会搞到把 09/02 00:48
23F:→ loveme00835: 所有成员都变成 public, 那这样你还写 C++ 干嘛呢 09/02 00:49
24F:→ lovejomi: 抱歉我没有跟上 请问写一个Access inner class有什麽 09/03 10:25
25F:→ lovejomi: 好处吗? 为什麽不直接散装getX/setX在Foo就好? 09/03 10:25
26F:→ lovejomi: 我还没理解精随~ 这样看起来caller必须多.access() 09/03 10:26
27F:→ lovejomi: 如果有多个data member也是必须开getA getB 多个嘛? 09/03 10:26
29F:→ loveme00835: 不做特别处理的单个成员 setter/getter 还不如不写 09/03 11:10
30F:→ loveme00835: access 是一个概念, 虽然本来的物件无法复制, 但存取 09/03 11:10
31F:→ loveme00835: 权是可以被任意复制转移的, 这是 OO 的设计, 仔细思 09/03 11:11
32F:→ loveme00835: 考一个问题: 如果一个物件只允许你存取部分的资料成 09/03 11:12
33F:→ loveme00835: 员, 那存取的介面是否应该直接开在这个类别里? 还是 09/03 11:12
34F:→ loveme00835: 把 "特定资料成员的存取权" 这个概念抽象化出来, 未 09/03 11:14
35F:→ loveme00835: 如果要做 composition 也可以做在这个 Access 类别 09/03 11:15
36F:→ loveme00835: 里, 和目标物件无关 09/03 11:16