Re: [讨论] 对于同事的coding style感到很感冒

楼主: lovejomi (JOMI)   2020-05-13 23:56:06
这篇推文有些确实让我不太理解 另开这篇问一下
"所以 pass by value 的情况下不用加上 const 的原因是
使用者只有执行函式的执行绪, 所以要求行为一致是没有意义的"
这句话我真的不太理解
const跟 thread有什么关联?
意思是说 都已经复制了
里面不管怎么使用这物件 R/W
外面就算有其他thread 不管做什么都已经跟这复制的物件无关了
所以const就没意义
======================
"const 不是为了避免修改, 而是要求物件的行为 consistent"
这边的consistent 我没有很深刻的感受 这边能多提供一些资讯吗?
另一个观点
如果对方没有你这些认知 完全单纯觉得 const就是语法上的不能修改
他才会有
void Foo(int a) 留言要+ const
void Foo(const string a) 留言觉得const useless
讲到这边都觉得有点矛盾了
如果不能修改 那const string a他不应该有意见....
所以我才推论他只有 primitive + const, non-trivial的就不加
这边我想问 如果要说服他或是把你这串观念用英文表达 有没有文章说这呢?
=====================================
"需要 noexcept 的情况全用 noexcept(bool) 来决定"
这边可否给我一些例子 我比较能理解用法
void XD(string a) noexcept(std::is_nothrow_move_constructible<string>::value)
{
}
当我写出这行时 我自己都不知道自己在干嘛了
1. a不见得是by move 那by copy怎么办?
2. 假设走by copy......这个XD函数 可能exception会发生在 参数传递时的呼叫...
这是不是表示 这函数已经不可能是noexcept了?
3. 因为缺乏noexcept(bool)这用法上的经验, 实在很难理解
虽然我不知道 exception specification为什么被deprecated, 但没了他
我怎么知道这函数丢什么exception? 如果他没写document 我根本无从得知 对吧?
当我在设计virtual function() 这时候 noexcept就已经要决定true or false了.
当决定了 derived 就被锁死了, 这边又让我觉得 interface上限定noexcept似乎太硬了
stackoverflow当然有一些方法 例如写两版
但我觉得这只是在找workaround没有很能接受
==========================================
承上
void XD()
noexcept(
noexcept(string()) && // for ss default construction
noexcept(string{*static_cast<string*>(nullptr)}) && // for s{lvalue}
noexcept(declval<string>().operator=(declval<string>())) && // for ss =
rvalue
noexcept(operator+(string{*static_cast<string*>(nullptr)},
declval<string>())) // for ss = lvalue+rvalue
)
{
string ss;
string s{ss};
ss = s+ string("");
}
假设上面一堆noexcept(bool) 我都没有写错
这是不是最完美的写法?
我写的每一行code 我都验证了他的exception or not
但我觉得有点过头了.....
===========================================
因为我在开发windows
用win32 api 跟 com api + std
理论上这两套都是error code base
所以我可以有这结论吗? =>
我自己开发的api 都可以 冠上 noexcept
然后实作总是
try{因为使用了std 他会丢 or new delete也会丢 }
catch(...) {return errorcode;}
虽然听起来有点以偏概全
但我想不到不能的理由
既能optimize又能保证不会有exception产生
还是try catch补上去 反而会有其他的overhead产生
(不是runtime exception发生后的成本 而是额外程式码被产生)
以上
谢谢
※ 引述《lovejomi (JOMI)》之铭言:
: 谢谢各位的意见
: 我会在逐一理解
: 目前有几个问题
: 最近比较被要求写exceptional 的code
: 假设我写
: string Foo(string s) noexcept
: {
: auto a = Get(); // noexcept
: string r = s+a;
: return r;
: }
: 然后我确认operator+是不是noexcept
: 结果当然不是
: 变成我要为了这简单的+
: 写一个try catch...去handle exception
: 三个抉择点
: 1. 不要标注noexcept , 反正坏了上面该处理 无责声明 (我prefer这)
: 2. try catch(type1) catch(type2) catch(...) 把所有查的到的exception都handle
: 要不要分开handle 是by design
: 3. 就现在这样写 反正真的发生bad_alloc 我也无能为力 terminate吧
: 以上有没有什么比较建议的做法可以讨用在多数情形
: 现在变成想提供noexcept 函数 都要查每一行function call是否都是noexcept
: 反而觉得 默认不该noexcept 才合理 有需求才标注noexcept
: ==================
: 一个很无聊的const问题
: 古早的effective c++推广 能加const就加
: 所以这位同事当然遵守
: void Foo(const int a)
: {
: auto const rc = Win32();
: auto const hr = COM();
: auto const error = 3rdAPI();
: ...
: }
: 我认同const能确保不被乱改
: 但我其实是觉得很多余
: local变量改了也不会怎样(也不该怎样)
: 甚至会被改表示你有需求 搞不好还会因此改code拿掉const
: 问题来了
: 他今天看到某同事
: void Bar(const string s){// read-only }
: 留言 这是多余的 要拿掉
: 对我来说当然不该补const 里面如果以后有copy需求 就不能move了
: 但我反倒觉得他两套标准
: 这case只有read加上const不正是他遵守的铁则吗?
: 也可以Bar(RVALUE); 为啥这情况他认为"useless"? 双重标准的感觉
: 我没看到他针对函数local non-trivial变量的写法
: 也许也是不加const为主 (也是双标)
: 这边的问题就是
: 尽可能const 这件事如果套用在modern C++ 有没有什么common的标准用法呢?
: 我比较主观的归纳是
: primitive type能const就const
: non-trivial type 都不要加(但这太偏颇了)
: 我自己是习惯都不加
: 以上
: 谢谢
作者: smmoon (邦)   2020-05-15 15:00:00
这类型的问题似乎永远也吵不完....
作者: steve1012 (steve)   2020-05-16 17:57:00
他是在header 留不要const? 还是在source file 留?top level const 不影响function signature. 有加跟没加一样

Links booklink

Contact Us: admin [ a t ] ucptt.com