2016-08-28 21 views
8

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); 

Trả lời

4

Bạn đang sử dụng C++ 11 trở lên?

Nhà điều hành gốc mới() khai báo trong C++ 98

throwing: 
void* operator new (std::size_t size) throw (std::bad_alloc); 

nothrow: 
void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) throw(); 

placement: 
void* operator new (std::size_t size, void* ptr) throw(); 

đã được thay đổi trong C++ 11 để sử dụng noexcept keyword:

throwing: 
void* operator new (std::size_t size); 

nothrow:  
void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) noexcept; 

placement: 
void* operator new (std::size_t size, void* ptr) noexcept; 

Reference link.

+0

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

+0

@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. –

1

Trong GCC 6 chế độ mặc định cho C++ có changed đến C++ 14. Cho đến GCC 5 nó là C++ 98.

Tuyên bố operator new đã thay đổi đôi chút trong C++ 11. Nó đã làm với thực tế là các đặc điểm kỹ thuật ném ngoại lệ là deprecated in C++11, và sự ra đời của nothrow khai:

  • throw (std::bad_alloc) đã được bỏ qua
  • throw() được thay thế bằng nothrow

Đối tốt nhất ngược -tính tương thích, bạn nên chỉ định tiêu chuẩn C++ nào bạn đang nhắm mục tiêu sử dụng đối số -std, như sau:

$ g++-6 -std=c++98 wtf.cpp -c 
Các vấn đề liên quan