Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C++] Specifiche di eccezione

    Dato il codice:

    codice:
    void funzione() throw( exception )
    {
        ...
    
        if ( ... )
            throw(exception);
    
       ....
    }

    Cosa significa il relativo warning:

    - warning C4290: specifica di una funzione C++ ignorata eccetto che per indicare che una funzione non è __declspec(nothrow)


    Grazie.

  2. #2

  3. #3

    Re: Re: [C++] Specifiche di eccezione

    Originariamente inviato da MacApp
    http://msdn.microsoft.com/en-us/library/sa28fef8.aspx
    A function is declared using exception specification, which Visual C++ accepts but does not implement.

  4. #4

    Re: Re: Re: [C++] Specifiche di eccezione

    Originariamente inviato da MacApp

    o_O e perchè il Visual C++ si comporta in questo modo?

    Cioè perchè interpreta il throw(type) come se fosse un throw(...)?

  5. #5

    Re: Re: Re: Re: [C++] Specifiche di eccezione

    Originariamente inviato da GliderKite
    o_O e perchè il Visual C++ si comporta in questo modo?
    non conosco le strategie commerciali della microsoft.

  6. #6

    Re: Re: Re: Re: [C++] Specifiche di eccezione

    Originariamente inviato da GliderKite
    o_O e perchè il Visual C++ si comporta in questo modo?
    Perché gli specificatori di eccezione, per come sono implementati in C++, sono fondamentalmente inutili e causano l'inserimento di codice per controllare che la funzione non sollevi nessun altro tipo, per cui in VC++ hanno deciso di non stare neanche a perderci tempo ad implementarli.
    Se il controllo fosse fatto a compile-time (=> una funzione throw(unqualchetipo) può richiamare solo funzioni throw(unqualchetipo) o throw(), oppure deve comunque uccidere le altre eccezioni dentro a blocchi try) allora potrebbe avere un qualche vago senso, ma sarebbe piuttosto complicato avere una exception-correctness perfetta a compile-time: pensa anche solo a come è una menata avere una const-correctness, figurati mantenere degli specificatori di eccezione perfetti per tutte le funzioni.
    Allo stato attuale delle cose, poi l'unica garanzia che danno gli specificatori di eccezioni è a runtime: se dentro la funzione viene sollevata un'eccezione non prevista, il programma viene terminato. Questo fa sì che di fatto ogni funzione con specificatori sia inglobata nell'equivalente di un blocco try che lascia passare le eccezioni contenute nello specificatore e del catchall chiama std::terminate.

    Per tutti questi motivi, le exception specifications sono deprecate (paragrafo "Deprecated Exception Specifications, Added noexcept") in C++0x; al loro posto, sarà possibile specificare noexcept nei casi in cui finora si usava throw(). In sostanza, si passa ad una gestione più semplice della questione, per cui si può garantire o che una funzione non sollevi nessuna eccezione (che può essere utile per codice che non può gestire eccezioni o per qualche ottimizzazione da parte del compilatore) o che genericamente può sollevare eccezioni. Un po' come i metodi possono essere const o non const, senza vie di mezzo.

    Leggi qui e qui.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.