亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
123下一頁
最近訪問板塊 發(fā)新帖
查看: 7808 | 回復(fù): 25
打印 上一主題 下一主題

[C++] 名字空間、重載候選與lambda。。。 這是g++的bug嗎。。。 [復(fù)制鏈接]

論壇徽章:
2
青銅圣斗士
日期:2015-11-26 06:15:59數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-07-24 06:20:00
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2015-11-17 19:58 |只看該作者 |倒序?yàn)g覽
30可用積分
簡化后的代碼大概是這樣:
  1. #include <assert.h>

  2. template<typename T> int f(T const&) { return 0; }
  3. namespace ns {
  4. template<typename T> int f(T const&) { return 1; } }

  5. int main()
  6. {
  7.       using ::ns::f;
  8.       assert(1==::ns::f([]{}));
  9.       assert(1==f(0));
  10. #ifndef NO_AMBIGUOUS
  11.       assert(1==f([]{}));
  12. #endif
  13. }
復(fù)制代碼
全局和ns名字空間下都有f函數(shù)模板。實(shí)際代碼已經(jīng)全部砍掉,只留下不同的返回值以方便后面區(qū)別。
然后在main里面using ::ns::f 。。。

::ns::f([]{}) 和 f(0) 調(diào)用的都是::ns::f。 問題出在f([]{})上。。。
用clang編譯調(diào)用的也是::ns::f。 而g++編譯就報(bào)錯(cuò)了。。。

  1. overload_lambda_ambiguous.cpp: In function 'int main()':
  2. overload_lambda_ambiguous.cpp:14:7: error: call of overloaded 'f(main()::<lambda()>)' is ambiguous
  3. overload_lambda_ambiguous.cpp:14:7: note: candidates are:
  4. overload_lambda_ambiguous.cpp:6:26: note: int ns::f(const T&) [with T = main()::<lambda()>]
  5. overload_lambda_ambiguous.cpp:4:26: note: int f(const T&) [with T = main()::<lambda()>]
復(fù)制代碼
從報(bào)錯(cuò)的最后兩行來看, 兩個(gè)f都在重載候選里, 并且都能匹配, 于是ambiguous。
那為什么f(0)又只選擇了::ns::f。。。
g++ -DNO_AMBIGUOUS 去掉那行后就正常了。

我用的g++版本比較老。。。 但在某個(gè)提供在線編譯的網(wǎng)站上用gcc 5.1編譯還是有這樣的問題。。。 從4.6.3到5.1。。。 都不修復(fù)嗎。。。

SO...
1. using ::ns::f; 后會(huì)hide ::f 對么?
2. 如果對, 那為什么用lambda作為實(shí)際參數(shù)調(diào)用時(shí)又沒hide? 這是g++的bug嗎?
3. 如果不對, f(0) 為什么只選中了::ns::f?

論壇徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龍
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥豬
日期:2014-04-01 08:56:02亥豬
日期:2014-04-08 08:38:58程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-05 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-01-07 06:20:00
2 [報(bào)告]
發(fā)表于 2015-11-17 20:57 |只看該作者
感覺跟看火星文一樣,C++就是強(qiáng)大啊,哈哈。

論壇徽章:
1
2015年辭舊歲徽章
日期:2015-03-03 16:54:15
3 [報(bào)告]
發(fā)表于 2015-11-17 21:16 |只看該作者
去 stackoverflow 問問吧,CU 已經(jīng)沒有人氣了。

然后去 gcc 提個(gè) bug

論壇徽章:
44
15-16賽季CBA聯(lián)賽之浙江
日期:2021-10-11 02:03:59程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2016-07-02 06:20:0015-16賽季CBA聯(lián)賽之新疆
日期:2016-04-25 10:55:452016科比退役紀(jì)念章
日期:2016-04-23 00:51:2315-16賽季CBA聯(lián)賽之山東
日期:2016-04-17 12:00:2815-16賽季CBA聯(lián)賽之福建
日期:2016-04-12 15:21:2915-16賽季CBA聯(lián)賽之遼寧
日期:2016-03-24 21:38:2715-16賽季CBA聯(lián)賽之福建
日期:2016-03-18 12:13:4015-16賽季CBA聯(lián)賽之佛山
日期:2016-02-05 00:55:2015-16賽季CBA聯(lián)賽之佛山
日期:2016-02-04 21:11:3615-16賽季CBA聯(lián)賽之天津
日期:2016-11-02 00:33:1215-16賽季CBA聯(lián)賽之浙江
日期:2017-01-13 01:31:49
4 [報(bào)告]
發(fā)表于 2015-11-17 23:35 |只看該作者
既然你已經(jīng)寫了using ::ns::f,這地方又沒涉及到ADL,那么f就應(yīng)該是::ns::f,想來GCC在這種地方可能實(shí)現(xiàn)的有點(diǎn)混亂。

不過報(bào)錯(cuò)也不是壞事,最怕的就是不報(bào)錯(cuò)給你隨便選一個(gè)那還不得吐血…………

論壇徽章:
12
2015年辭舊歲徽章
日期:2015-03-03 16:54:1515-16賽季CBA聯(lián)賽之同曦
日期:2017-03-17 19:13:162016科比退役紀(jì)念章
日期:2016-11-07 08:28:12luobin
日期:2016-06-17 17:46:36wusuopu
日期:2016-06-17 17:43:4515-16賽季CBA聯(lián)賽之福建
日期:2016-01-14 12:49:22程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-12-13 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-06-08 22:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-06-08 22:20:002015年亞洲杯之科威特
日期:2015-03-24 14:21:272015年迎新春徽章
日期:2015-03-04 09:57:092016科比退役紀(jì)念章
日期:2018-04-10 16:20:18
5 [報(bào)告]
發(fā)表于 2015-11-18 08:34 |只看該作者
估計(jì)gcc的支持也還沒那么穩(wěn)定,說不定LZ還真的發(fā)現(xiàn)了一個(gè)bug,

論壇徽章:
12
2015年辭舊歲徽章
日期:2015-03-03 16:54:1515-16賽季CBA聯(lián)賽之同曦
日期:2017-03-17 19:13:162016科比退役紀(jì)念章
日期:2016-11-07 08:28:12luobin
日期:2016-06-17 17:46:36wusuopu
日期:2016-06-17 17:43:4515-16賽季CBA聯(lián)賽之福建
日期:2016-01-14 12:49:22程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-12-13 06:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-06-08 22:20:00程序設(shè)計(jì)版塊每日發(fā)帖之星
日期:2015-06-08 22:20:002015年亞洲杯之科威特
日期:2015-03-24 14:21:272015年迎新春徽章
日期:2015-03-04 09:57:092016科比退役紀(jì)念章
日期:2018-04-10 16:20:18
6 [報(bào)告]
發(fā)表于 2015-11-18 08:34 |只看該作者
估計(jì)gcc的支持也還沒那么穩(wěn)定,說不定LZ還真的發(fā)現(xiàn)了一個(gè)bug,

論壇徽章:
2
青銅圣斗士
日期:2015-11-26 06:15:59數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-07-24 06:20:00
7 [報(bào)告]
發(fā)表于 2015-11-18 19:14 |只看該作者
回復(fù) 2# fender0107401
沒有吧? 除了[]{}其他都是C++98的東西吧。。。

論壇徽章:
2
青銅圣斗士
日期:2015-11-26 06:15:59數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-07-24 06:20:00
8 [報(bào)告]
發(fā)表于 2015-11-18 19:16 |只看該作者
回復(fù) 3# lost_templar
寫e文比較費(fèi)時(shí)。。。

論壇徽章:
2
青銅圣斗士
日期:2015-11-26 06:15:59數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-07-24 06:20:00
9 [報(bào)告]
發(fā)表于 2015-11-18 19:38 |只看該作者
本帖最后由 OwnWaterloo 于 2015-11-18 19:40 編輯

回復(fù) 4# windoze

目前還好。。。 反正是寫測試時(shí)碰到的。。。  即使繞不過去大不了不測了

大概情況是這樣。。。

1. 有幾個(gè)宏。。。
MODULE_NS
MODULE_NS_ENTER
MODULE_NS_LEAVE
如果MODULE_NS沒有定義就有一個(gè)默認(rèn)值

2. 后續(xù)代碼在合適的地方會(huì)用這些宏
MODULE_NS_ENTER
... // 這里面定義的一些宏,因?yàn)椴恢浪鼈儠?huì)在何處展開,所以會(huì)使用 MODULE_NS::detail::some_thing 之類的
MODULE_NS_LEAVE

如果對默認(rèn)放的名字空間不滿意, 就在包含module.hpp前定義這幾個(gè)宏,把內(nèi)容放到別的名字空間里去。

3. 測試使用這幾個(gè)宏

本來應(yīng)該是分幾個(gè)cpp單獨(dú)測的。

  1. // test_ns_global.cpp
  2. #define MODULE_NS
  3. #define MODULE_NS_ENTER
  4. #define MODULE_NS_LEAVE
  5. #include "module.hpp"
復(fù)制代碼

  1. // test_ns.cpp
  2. #define MODULE_NS ::ns
  3. #define MODULE_NS_ENTER namespace ns {
  4. #define MODULE_NS_LEAVE }
  5. #include "module.hpp"
復(fù)制代碼

  1. // test_ns_nested.cpp
  2. #define MODULE_NS ::ns::util
  3. #define MODULE_NS_ENTER namespace ns { namespace util {
  4. #define MODULE_NS_LEAVE } }
  5. #include "module.hpp"
復(fù)制代碼
test_ns_global.cpp, test_ns.cpp, test_ns_nested.cpp 里面顯然還要包含一個(gè)真正寫測試的文件, 不然重復(fù)寫這么多次不科學(xué)。

我覺得這樣文件太多很煩。。。 就都放在一個(gè)test_ns.cpp里了。

  1. // test_ns.cpp
  2. #ifndef ONLEAVE_TEST_NS_NAME
  3. #include <assert.h>
  4. #include <typeinfo>
  5. // include ...

  6. // 包含自己3次。。。
  7. #define MODULE_NS
  8. #define MODULE_NS_ENTER
  9. #define MODULE_NS_LEAVE
  10. #define MODULE_TEST_NS_NAME global
  11. #include "test_ns.cpp"

  12. #define MODULE_NS ::ns
  13. #define MODULE_NS_ENTER namespace ns {
  14. #define MODULE_NS_LEAVE }
  15. #define MODULE_TEST_NS_NAME ns
  16. #include "test_ns.cpp"

  17. #define MODULE_NS ::ns::util
  18. #define MODULE_NS_ENTER namespace ns { namespace util {
  19. #define MODULE_NS_LEAVE } }
  20. #define MODULE_TEST_NS_NAME nested
  21. #include "test_ns.cpp"

  22. int main() {}
  23. #else /* defined(MODULE_TEST_NS_NAME)*/
  24. // 實(shí)際測試用的代碼
  25. #endif
復(fù)制代碼
然后就中招了。。。

如果gcc不報(bào)錯(cuò),但選錯(cuò)了名字空間的話, 測試應(yīng)該全都能通過(畢竟所有名字空間里的功能都是一樣的。。。)。。。
但有測試?yán)锩嬗休敵鰐ypeid(x).name(), 所以仔細(xì)看還是能看出來。。。

論壇徽章:
2
青銅圣斗士
日期:2015-11-26 06:15:59數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-07-24 06:20:00
10 [報(bào)告]
發(fā)表于 2015-11-18 19:46 |只看該作者
本帖最后由 OwnWaterloo 于 2015-11-18 19:47 編輯

回復(fù) 4# windoze

module.hpp里面肯定會(huì)用C++11的東西, 所以用戶也肯定要用C++11, 所以。。。
相比:

  1. #define MODULE_NS ::my::favorite::ns
  2. #define MODULE_NS_ENTER namespace my { namespace favorite { namespace ns {
  3. #define MODULE_NS_LEAVE }}}
  4. #include "module.hpp"
復(fù)制代碼
用C++11新加的這個(gè)(namespace alias?):

  1. #include "module.hpp"
  2. namespace favorite = a::default::explict::and::long::ns;
復(fù)制代碼
會(huì)更方便點(diǎn)?
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP