Proč to může být sestaven v GNU / C ++, nelze sestaven v VC ++ 2010 RTM?

hlasů
1
#include <stdlib.h>
#include <iostream>
#include <memory>
#include copy_of_auto_ptr.h
#ifdef _MSC_VER
#pragma message(#include <string>)
#include <string>
// http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html#Diagnostic-Pragmas
#endif

/*
 case 1-4 is the requirement of the auto_ptr.
 which form http://ptgmedia.pearsoncmg.com/images/020163371X/autoptrupdate/auto_ptr_update.html
*/
/*
 case 1.
 (1) Direct-initialization, same type, e.g.
*/
std::auto_ptr<int> source_int() {
    // return std::auto_ptr<int>(new int(3));
    std::auto_ptr<int> tmp(new int(3));
    return tmp;
}

/*
 case 2.
 (2) Copy-initialization, same type, e.g.
*/
void sink_int(std::auto_ptr<int> p) {
    std::cout << sink_int <<  << *p << std::endl;
}

/*
 case 3.
 (3) Direct-initialization, base-from-derived, e.g.
*/

class Base {
public:
    Base() {
        std::cout << creating Base object... << std::endl;
    }
    virtual ~Base(){
        std::cout << destoring Base object... << std::endl;
    }
    virtual void go(){
        std::cout << Base::go() << std::endl;
    }
};

class Derived : public Base {
public:
    Derived() {
        std::cout << creating Derived object... << std::endl;
    }
    ~Derived(){
        std::cout << destoring Derived object... << std::endl;
    }
    void go(){
        std::cout << Derived::go() << std::endl;
    }
};

std::auto_ptr<Derived> source_derived() {
    // return std::auto_ptr<Derived>(new Derived());
    std::auto_ptr<Derived> tmp(new Derived());
    return tmp;
}

/*
 case 4.
 (4) Copy-initialization, base-from-derived, e.g.
*/
void sink_base( std::auto_ptr<Base> p) {
    p->go();
}

int main(void)
{
    /*
    // auto_ptr
    */
    // case 1. // auto_ptr
    std::auto_ptr<int> p_int(source_int());
    std::cout << *p_int << std::endl;

    // case 2. // auto_ptr
    sink_int(source_int());

    // case 3. // auto_ptr
    std::auto_ptr<Base> p_derived(source_derived());
    p_derived->go();

    // case 4. // auto_ptr
    sink_base(source_derived());

    return 0;
}

Eclipse (GNU C ++ exe -v gcc version 3.4.5 (mingw-vista speciální R3).) Je to dvě kompilace chyba:

Popis zdroje Cesta Umístění Typ inicializace tvrzení 1 z void sink_base(std::auto_ptr<Base>)' from result ofstd :: auto_ptr <_Tp> :: operátor std :: auto_ptr <_Tp1> () [s _Tp1 = základně _Tp = odvozená] auto_ptr_ref_research.cpp auto_ptr_ref_research / auto_ptr_ref_research 190 C / C ++ problém

Popis Resource Path Poloha Sem žádná odpovídající funkce pro volání `std :: auto_ptr :: auto_ptr (std :: auto_ptr)‘ auto_ptr_ref_research.cpp auto_ptr_ref_research / auto_ptr_ref_research 190 C / C ++ Problem

Ale je to přímo v VS2010 RTM.

otázky:

  1. Které kompilátor stát standardem ISO C ++?

  2. Obsah případ 4, je problém „auto_ptr & auto_ptr_ref chcete vyřešit?“

Položena 06/04/2010 v 18:10
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
7

Myslím, že zkrácená verze:

struct X
{
    X() {}
    X(X&);
};

X make() { return X(); }

void receive(X ) { }

int main()
{
    receive(make());
}

Poznámka neobvyklý tvar kopírovacího konstruktoru (z non-const odkazem), jež brání (podle normy GCC je správné) možnost kopírování konstrukci instanci z dočasné (výsledek make()).


Situace je mnohem složitější, protože std::auto_ptrpokusy vyřešit s výsledným omezením s obalem auto_ptr_ref. Vzhledem k tomu, budete také chtít změnit typ kurzoru, pravděpodobně to porouchá někde se všemi těmi implicitní konverze a VC ++ podaří sestavit to jen díky nestandardním rozšířením (umožňující závazné rvalues non-konstantní referencí).

Překladač mi vlastně říká pravdu, že. Na problém řádek:

warning C4239: nonstandard extension used : 'argument' : 
conversion from 'std::auto_ptr<_Ty>' to 'std::auto_ptr<_Ty> &' 

V každém případě, std::auto_ptrje trochu neúspěšném pokusu s bizarními sémantiky a zastaralé v příštím standardu. V jazyce C ++ 0x (např gcc 4.4.1), že to bude fungovat, pokud jste vyměnili všechny výskyty auto_ptrse unique_ptr, a změnil podpis dřez funkcí použít rvalue odkazy získat vlastnictví převádějící.

void sink_base( std::unique_ptr<Base>&& p);
Odpovězeno 06/04/2010 v 19:00
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more