为什么 g++ 不发出这个与构造函数相关的 noexcept 启用"-fpic"的警告?
Why doesn't g++ emit this constructor-related noexcept warning with `-fpic` enabled?
我有下一个代码:
#include <exception>
#include <cstdlib>
void g() { throw 1; }
void (*p)() = g;
template <class T>
void f(T) noexcept (noexcept (T())) // warning 1
{
p();
}
struct A { A() { } }; // warning 2
int main()
{
try { f(A()); } catch (int) { }
return 1;
}
下一个选项:-fno-pic -fmessage-length=0 -std=c++0x -Wnoexcept
g++抛出下一个警告:
noexcept03.C:16:6: warning: noexcept-expression evaluates to 'false' because of a call to 'A::A()' [-Wnoexcept]
noexcept03.C:21:12: warning: but 'A::A()' does not throw; perhaps it should be declared 'noexcept' [-Wnoexcept]
但是,为什么当我使用-fpic
而不是-fno-pic
时,g++
不会发出任何警告?
编辑:
GCC版本-4.7.2
在-fpic
的情况下不会发出警告,因为编译器假设构造函数A::A()
可以抛出。
在编译PIC代码时,GCC假设每个全局名称都可以被其他模块的符号覆盖。因此,在没有显式noexcept
声明的情况下,GCC必须保守地假设这样的函数可以抛出异常,即使它可以静态地证明它现在看到的版本不能。
如需参考,请参阅此处的错误和补丁http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29323#c7(代码从那以后有点变化,但它是这样开始的)
以上适用的示例:
/* inline */ int f() { return 0; }
int g() noexcept (noexcept(f())) { return f() + 1; }
所以,这就是没有警告的直接原因。以下是我对它的看法。
然而,C++11说:
7.1.2函数说明符[dcl.fct.spec]
4应在它是odr使用的,并且在每个案例(3.2)。
即,对于内联函数,如果一个函数被确定为不抛出,GCC可以假设这样一个函数的每个潜在覆盖也不能抛出。
从这个意义上说,GCC对内联函数过于保守,无论是在原始测试用例中,还是在上面未注释inline
关键字的示例中,即使使用了-fpic/-fPIC
,GCC也应该发出警告。
相关文章:
- 编译时未启用intel oneApi CUDA支持
- OpenGL在启用深度测试时不会丢弃我的碎片
- Visual C++GC接口如何启用它以及要包含哪个库
- 如何在自定义类中启用'auto loops'?
- 根据某个函数是否存在启用模板
- 在noexcept 规范中是否允许使用"this"?
- 使用 noexcept 运算符 depenendet
- 视觉工作室 2017;启用 /permissive 时,类型 "const wchar_t *" 的参数与类型 "PWSTR" 的参数不兼容
- 启用从"vector<const T>&"到"const vector&"的隐式转换<T>
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- NOEXCEPT 函数调用运算符的说明符_Not_fn
- 参数包内 noexcept 说明符
- 在 Eclipse 上启用 C++17 以使用 'std::byte'
- 当 noexcept 函数尝试在 gcc 或 clang 中调用非 noexcept 函数时启用警告
- 如何为一段代码启用 -permissive
- 是否可以/希望创建不可复制的共享指针模拟(以启用weak_ptr跟踪/借用类型语义)?
- 在 GCC 中启用"differing levels of indirection"警告/错误
- 使用 Doxygen 记录枚举类值,而不启用EXTRACT_ALL
- '_HAS_CXX17'宏是否可用于自定义项目标头以启用C++17 语言集功能?
- 为什么 g++ 不发出这个与构造函数相关的 noexcept 启用"-fpic"的警告?