Có thể ai đó giải thích cho tôi tại sao mã này không biên dịch bằng g ++ phiên bản 6.2.0, nhưng biên dịch tốt với phiên bản 4.0.0.2 svn274438-1 và phiên bản icpc 16.0.2Trình chỉ định ngoại lệ khác nhau với g ++ 6.2
$ cat wtf.cpp
#include <cstdio>
#include <new>
void *operator new(std::size_t) throw(std::bad_alloc);
void *operator new(std::size_t) throw (std::bad_alloc) { void *p; return p; }
$ g++-6 wtf.cpp -c
wtf.cpp: In function ‘void* operator new(std::size_t)’:
wtf.cpp:4:7: error: declaration of ‘void* operator new(std::size_t) throw (std::bad_alloc)’ has a different exception specifier
void *operator new(std::size_t) throw (std::bad_alloc) { void * p; return p; }
^~~~~~~~
wtf.cpp:3:7: note: from previous declaration ‘void* operator new(std::size_t)’
void *operator new(std::size_t) throw(std::bad_alloc);
Bằng cách thêm '-std = C++ 03', g ++ biên dịch tốt. Nhưng điều đó không giải thích tại sao tôi nhận được thông báo lỗi này, phải không? Dòng 3 của 'wtf.cpp' vẫn có cùng một specifier exception như dòng 4, tôi nghĩ vậy. – BigDawg
@BigDawg - 'throw()' và 'noexcept' có hiệu ứng tương tự, nhưng' throw (std :: bad_alloc) 'hoàn toàn khác với việc không chỉ định các ngoại lệ được ném ra. –