2013-03-17 11 views
6
#include <iostream> 

class A {}; 

typedef int (*j)() throw(A); 

int f() 
{ 
    std::cout << "function f" << std::endl; 
    return 0; 
} 

int main() 
{ 
    j y = f; 
    y(); 
} 

We wszystkich witrynach i Stroustrup również mówi, że wystąpi błąd kompilacji, ale kompiluje. Czy są jakieś zmiany w standardzie?Czy jest to błąd kompilacji typedef int (* j)() throw (A)?

+0

Który kompilator i jaką wersję? –

+0

Microsoft visual studio 2012 –

+0

Odkąd mówisz, że będziesz wyrzucał obiekt 'typename A 'w prototypie' foo() 'bez zadeklarowania go jeszcze, nie widzę jak to * nie jest * a błąd kompilatora. Powinieneś otrzymać niezdefiniowany symbol błędu "A" lub "oczekiwany") "". – WhozCraig

Odpowiedz

2

wiem, że to nie jest odpowiedź na to pytanie -

MSVC 2010 (które mam) wyrzuca żadnego błędu, kompiluje i działa bez czkawki

G ++ (GNU) mówi, error: 'j' declared with an exception specification

Clang mówi: error: exception specifications are not allowed in typedefs

Opis dolny: Błąd kompilatora w MSVC.

+4

To nie jest błąd MSVC. Jest to celowy wybór MSVC, aby zignorować większość specyfikacji wyjątków: tylko 'throw()' ma wpływ. Ich parser wciąż musi je zaakceptować i najwidoczniej przyjmuje je zbyt liberalnie. Zobacz http://msdn.microsoft.com/en-us/library/wfa0edys.aspx – Sjoerd

+0

@Sjoerd - umyślnie lub w inny sposób, jest to błąd. Kompilator nie poprawnie implementuje standard C++. –

+0

Jakiekolwiek odchylenie od standardu jest błędem @Sjoerd delibrate lub w inny sposób! –

0

Specyfikacje wyjątków nie są częścią typu funkcji. Na przykład nie można ich przeciążać; a wskaźnik do funkcji nie zawiera specyfikacji wyjątków. Jak mówi @Aniket, jest to błąd Microsoftu, że ich kompilator akceptuje tę deklarację.

Powiązane problemy