[问题] 透过copy elision 来return by value

楼主: lovejomi (JOMI)   2020-09-01 11:36:12
标题不好下
主要问题是
一个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出去给外面操作
该怎么做比较好呢?
谢谢
作者: Lipraxde (Lipraxde)   2020-09-01 12:19:00
https://stackoverflow.com/questions/43546213提供 lock、unlock是说 getLock 这样写好怪,有连结可以让我观摩一下吗?
楼主: lovejomi (JOMI)   2020-09-01 12:30:00
没有连结耶 内部的code 不只一个人这样写 @@
作者: Lipraxde (Lipraxde)   2020-09-01 18:18:00
可能第一个人写下去后后面的接着抄吧...
楼主: lovejomi (JOMI)   2020-09-01 19:40:00
也许是这样 但我是想探讨 这种方式是否没任何问题,如果没有 这感觉很钻漏洞的感觉
作者: Lipraxde (Lipraxde)   2020-09-01 20:50:00
我是觉得不行啦,写这种意图怪怪的 code...
作者: loveme00835 (发箍)   2020-09-02 00:04:00
你先想写类别的目的是什么? 是提供抽象化. 而 mutex目的就是要确保抽象化有被达成, 具体来说就是物件的状态改变不会有意外发生. 你为了 mutex 反而增加和类别责任无关的方法, 你同事都不会觉得奇怪吗? 一般有mutex 也会经过封装, 让使用者传入 callback 来间接存取物件, 实作可以参考 boost::with_lock_guard(),多做一层封装在之后确定存取都在同一个 thread 之后也可以直接把 mutex 拿掉, client code 不需要做调整所以你会看到有些函式库进 critical section 是给callback 而不是明确地写 lock 叙述https://wandbox.org/permlink/zLuj9ynXtafalAYi当你在传东西给 callback 的时候, 最好是用限缩后的接口, 看是要用 std::forward_as_tuple() 或是允取存取的成员放在 base class 内, 再怎么样都不会搞到把所有成员都变成 public, 那这样你还写 C++ 干嘛呢
楼主: lovejomi (JOMI)   2020-09-03 10:25:00
抱歉我没有跟上 请问写一个Access inner class有什么好处吗? 为什么不直接散装getX/setX在Foo就好?我还没理解精随~ 这样看起来caller必须多.access()如果有多个data member也是必须开getA getB 多个嘛?
作者: loveme00835 (发箍)   2020-09-03 11:08:00
https://wandbox.org/permlink/PF98F9AhlvpqsIgr不做特别处理的单个成员 setter/getter 还不如不写access 是一个概念, 虽然本来的物件无法复制, 但存取权是可以被任意复制转移的, 这是 OO 的设计, 仔细思考一个问题: 如果一个物件只允许你存取部分的资料成员, 那存取的接口是否应该直接开在这个类别里? 还是把 "特定资料成员的存取权" 这个概念抽象化出来, 未如果要做 composition 也可以做在这个 Access 类别里, 和目标物件无关

Links booklink

Contact Us: admin [ a t ] ucptt.com