移植了一个库,眼睛快要瞎了。

2021-03-10 05:50:35 +08:00
 xuegy
源代码只支持 gcc 编译,clang 疯狂报错 ambiguous 。一边编译一边对着报错信息改,一共改了四百行,几乎全都是把 xxx A=B; 改成 xxx A(B);
眼睛都快要瞎了。我是该吐槽 gcc 下限太低什么玩意都给编译呢,还是该吐槽 clang 严格遵守标准过于死板呢?
5970 次点击
所在节点    C++
36 条回复
codehz
2021-03-10 06:04:20 +08:00
哎,不应该改成 xxx A{B}; 吗
xuegy
2021-03-10 06:08:53 +08:00
@codehz 圆括号能用为啥要非要上花括号?
Tony042
2021-03-10 06:13:48 +08:00
@xuegy 两个还是不太一样,花括号是 initializer_list,两个略有区别,我也不太清了,依稀记得花括号会更好一些,可以防止一些歧义。
Tony042
2021-03-10 06:14:21 +08:00
为啥不写个 operator=直接考虑类型转换
xuegy
2021-03-10 06:18:01 +08:00
@Tony042 非要这样写就默认至少 C++11 了吧,兼容性咋办?
BrettD
2021-03-10 07:06:07 +08:00
禁用 clang 编译警告(-Wno-everything )解千愁(逃
kokutou
2021-03-10 07:19:06 +08:00
感觉可以写个脚本批量处理吧。。。
BrettD
2021-03-10 07:23:00 +08:00
哦没事了,原来是编译错误
kekxv
2021-03-10 07:50:14 +08:00
永 gcc 编译为动态库或者静态库来用?
geelaw
2021-03-10 07:50:49 +08:00
@Tony042 #4 这里需要的是 ctor 不是 operator=。

@xuegy #2 因为 https://en.wikipedia.org/wiki/Most_vexing_parse
但比较奇怪,一般来说用 = 初始化不会有歧义问题,反而是用函数调用初始化容易有“最烦人的解读”。
wnpllrzodiac
2021-03-10 08:12:39 +08:00
写个 py 脚本搞?
wnpllrzodiac
2021-03-10 08:14:17 +08:00
@Tony042 最好都用 花瓜号(侯杰大师发音),比较保险
feather12315
2021-03-10 08:42:54 +08:00
sed 一行的事情
AndyAO
2021-03-10 08:44:54 +08:00
感觉这种事情应该写个脚本来解决吧,甚至正则表达式,也有可能直接全部解决
lifanxi
2021-03-10 08:46:56 +08:00
我没有理解为什么 clang 要报有歧义,如果 xxx 类的构造函数和类型转换函数没有花式作死的话,xxx A=B;就是调用拷贝构造函数通过 B 构造 A,好像没啥歧义啊。
cominghome
2021-03-10 08:58:22 +08:00
所以说程序员掌握一门脚本语言也是很重要的
lcdtyph
2021-03-10 09:02:46 +08:00
@lifanxi
不一样,xxx A(B);是 direct initialization,而 xxx A=B;是 copy initialization
区别是当 AB 类型不同时 copy initialization 会考虑隐士转换,从而引入另一条构造路径导致歧义。
解决方法之一可以在正确的地方使用 explicit
mlhadoop
2021-03-10 09:06:02 +08:00
还以为做了啥手术 /doge
nmap
2021-03-10 09:51:36 +08:00
还以为你移植了眼睛
pluxj
2021-03-10 10:09:53 +08:00
用 花括号 {} 好一些,不然可能认为你在声明一个函数

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/760170

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX