上C++ 11甲教科書的Torsten T.威爾說,因爲C++ 11,std::swap
將使用由ADL發現非成員swap
如果這樣的非成員函數被定義,因此,圖案std :: swap保證通過ADL找到非成員交換?
using std::swap;
swap (obj1, obj2);
可以總是被一個簡單的
不幸的是,我沒有在其他地方找到這樣的聲明。
是什麼事實?
上C++ 11甲教科書的Torsten T.威爾說,因爲C++ 11,std::swap
將使用由ADL發現非成員swap
如果這樣的非成員函數被定義,因此,圖案std :: swap保證通過ADL找到非成員交換?
using std::swap;
swap (obj1, obj2);
可以總是被一個簡單的
不幸的是,我沒有在其他地方找到這樣的聲明。
是什麼事實?
從C++ 14(或更具體N4140):
要求:類型
T
應MoveConstructible(表20)和MoveAssignable(表22)。 效果:交換存儲在兩個位置的值。
這裏沒有關於致電非會員swap
的內容。所以不,沒有保證std::swap
通過非會員swap
實施。
根據用戶定義的非會員ADL swap
,甚至不允許實施std::swap
也不完全清楚。
我不確定某個特定的實現可以(合法地)執行此操作。它假定非成員'swap'產生期望的效果(交換兩個對象的值)。如果編譯器可以看到非成員的'swap'實現,並且它足夠簡單,編譯器就可以推斷它確實交換了對象,那麼我想它可以調用它。但我不認爲編譯器可以對非重要的非成員'交換'函數做任何假設,因爲如果它們真的交換了對象就不清楚了。 – Cornstalks
好的,那麼這裏的教科書是錯誤的。然而,一般來說,這是非常好的。 – JohnB
@Cornstalks:這是一個很好的觀點。 –
我懷疑這是真的,因爲如果非成員'swap'是通過'std :: swap'實現的,那麼存在無限的相互遞歸。或者更糟糕的是,'swap'函數並不交換對象(而是恰巧做了一些完全不相關的事情,只是偶爾命名爲'swap'並帶有兩個可變引用)。但那只是我的直覺。我知道有時候是完全錯誤的。 – Cornstalks