g++ 6.2 的不同异常说明符
Different exception specifier with g++ 6.2
有人能给我解释一下为什么这段代码不能用 g++ 版本 6.2.0 编译,但可以用 clang++ 版本 3.9.0-svn274438-1 和 icpc 版本 16.0.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);
您使用的是 C++11 或更高版本吗?
C++98 中原始的 operator new() 声明
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++11 中更改为使用 noexcept 关键字:
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;
在GCC 6中,C++的默认模式有changed到C++14。在 GCC 5 之前是 C++98.
operator new
声明在 C++11 中略有变化。这与抛出异常规范是deprecated in C++11,以及nothrow
声明的引入有关:
throw (std::bad_alloc)
已被省略
throw()
替换为 nothrow
为了获得最佳的向后兼容性,您应该使用 -std
参数指定您的目标 C++ 标准,如下所示:
$ g++-6 -std=c++98 wtf.cpp -c
有人能给我解释一下为什么这段代码不能用 g++ 版本 6.2.0 编译,但可以用 clang++ 版本 3.9.0-svn274438-1 和 icpc 版本 16.0.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);
您使用的是 C++11 或更高版本吗?
C++98 中原始的 operator new() 声明
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++11 中更改为使用 noexcept 关键字:
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;
在GCC 6中,C++的默认模式有changed到C++14。在 GCC 5 之前是 C++98.
operator new
声明在 C++11 中略有变化。这与抛出异常规范是deprecated in C++11,以及nothrow
声明的引入有关:
throw (std::bad_alloc)
已被省略throw()
替换为nothrow
为了获得最佳的向后兼容性,您应该使用 -std
参数指定您的目标 C++ 标准,如下所示:
$ g++-6 -std=c++98 wtf.cpp -c