2014-04-08 5 views
5

In einem solchen Code festgelegt zu vermeiden:Ist das legal von der Erstellung tatsächlichen Kopien Vergleicher Objekt

Comparator comp(3); 

set<string, Comparator> s1(comp); 
set<string, Comparator> s2(comp); 
set<string, Comparator> s3(comp); 
set<string, Comparator> s4(comp); 

die tatsächliche Instanz der Vergleicher (nämlich comp) bei jeder Erstellung eines Satzes Objekt als cpp kopiert Referenzzustände

der Behälter eine interne Kopie von Alloc und comp hält, die verwendet werden, Speicher zuzuteilen und die Elemente während seiner gesamten Lebensdauer zu sortieren.

So fragen wir, wenn dies in C++

legal ist
#include <set> 
#include <iostream> 

struct A { 
    int i = 0; 
    bool operator()(int a, int b) 
    { 
     ++i; 
     return a < b; 
    } 
}; 

int main() 
{  
    A a; 
    std::set<int, A&> s1({1, 2, 3}, a); 
    std::set<int, A&> s2({4, 5, 6}, a); 
    std::cout << a.i; 
} 

Vielen Dank im Voraus.

+0

_'So wir gefragt, ob dies in C++ legal '_ Mindestens es [kompiliert fein] (http://ideone.com/O85lFk) und tut, was erwartet wird. –

+0

Ja, wir bemerkten :) –

+1

@ πάνταῥεῖ: Das ist überhaupt kein gültiges Argument in C++ –

Antwort

4

Ich bin nicht in der Lage zu finden Wortlaut im Standard verbieten mit einem Referenztyp als Vergleichsfunktion. Es scheint also, dass dies legal wäre. Beachten Sie, dass einige Dinge wie das Erstellen eines solchen Sets standardmäßig verboten sind, da Ihr Vergleichstyp nicht standardmäßig konstruierbar ist.

Schließlich beachten Sie, dass der kanonische C++ - Ansatz ist nicht dies tun, aber den Zustand extern zu erhalten. Wenn Sie diesen Ansatz ist es völlig klar, was Sie tun und garantiert sicher sein:

#include <set> 
#include <iostream> 

struct A { 
    int& i_; 
    explicit A(int& state) : i_(state) { } 
    bool operator()(int a, int b) 
    { 
     ++i_; 
     return a < b; 
    } 
}; 

int main() { 
    int i; 
    std::set<int, A> s1({1, 2, 3}, A(i));  
    std::set<int, A> s2({4, 5, 6}, A(i));   
    std::cout << i << endl; 
} 
Verwandte Themen