2017-11-04 25 views
4

this answerのように私のクラスのスワップ関数がオーバーロードされましたが、ソート(std::sort)コンパイラはまだstd::swapを使用しています。私は私のアプローチとリンクされた答えに書かれているものとの間に違いは見られません。ここに私のコードの再現です:スワップ関数のオーバーロードを無視する

#include <vector> 
#include <iterator> 
#include <algorithm> 
#include <iostream> 

struct B 
{ 
struct A 
{ 
    friend void swap(A & a, A & b) 
    { 
     std::swap(a.a, b.a); 
     std::cout << "my swap\n"; 
    } 

    A(int _a) : a(_a) {} 
    bool operator<(const A & other) { return a < other.a; } 
    int a; 
}; 
}; 

int main() 
{ 
    std::vector<B::A> v{1, 2, 3, 5, 4}; 
    std::sort(std::begin(v), std::end(v)); 
} 

hereも実行可能な例です。

+0

[これ](http://eel.is/c++draft/utility.requirements#swappable.requirements-3.2)関連するかもしれない:_ "スワップ要件を持つライブラリコンポーネントが含まれているかどうかを指定されていませんヘッダを使用して、適切な評価コンテキストを確保してください。 "_ –

+1

[あなたのスワップ機能は' std'名前空間の内側からでも正しく呼び出されているようです。](https://wandbox.org/permlink/x6IV0XUtJaPXYPXW)。たぶん、 'std :: sort'では利用されていないかもしれません。 – VTT

+0

ちょうど[パス](http://en.cppreference.com/w/cpp/algorithm/sort)関数オブジェクト::スワップはstdし、それを行うこと。 – Vorac

答えて

2

標準はstd::sortが実際にswapを呼び出すことが保証され、それが唯一のタイプは、私のように解釈しないと、特定の概念を満たさなければならないと述べていることをその仕様(§25.4.1.1[alg.sort])での状態はありません保証:

が必要です: RandomAccessIterator は ValueSwappable (17.6.3.2)の要件を満足しなければなりません。 *最初 のタイプは MoveConstructible(表20)および MoveAssignable(表22)の要件を満足しなければなりません。

したがって、実装によってはむしろがあるかもしれません。です。 This answerもその情報を提供するかもしれません。

+0

リンクされたポストは今6歳憶測が素晴らしい答えではない、あなたの主張をバックアップすることをお勧めします、物事が変更された可能性が –

+0

まあが、何かを証明します。存在しないのは難しいことですが、私はRusの存在を証明できません売るのティーポットも。 §25.4.1.1 [alg.sort]は 'swap'を使用しているとは言わず、' Swapable'だけを要求しています。私はそれを証明するつもりではなく、 'ソート'が必ずカスタムの 'スワップ'によって注入されるわけではないという兆候として考えています。 – Jodocus

+0

理想的な答えは、「標準の場所どのように 'のstd :: sort'スワップ物事を上の制限なし」を徹底的標準を経て証明され、だろう。 –

関連する問題