gpt4 book ai didi

c++ - 处理 gcc 的 noexcept 类型警告

转载 作者:IT老高 更新时间:2023-10-28 12:41:56 32 4
gpt4 key购买 nike

考虑这个例子,来自 bug 80985 :

template <class Func>
void call(Func f)
{
f();
}

void func() noexcept { }

int main()
{
call(func);
}

在启用所有警告的情况下编译它,就像你做的那样,产生:

$ g++ -std=c++14 -Wall foo.cxx 
foo.cxx:2:6: warning: mangled name for ‘void call(Func) [with Func = void (*)() noexcept]’ will change in C++17 because the exception specification is part of a function type [-Wnoexcept-type]
void call(Func f)
^~~~

我应该如何处理这个警告?解决方法是什么?

最佳答案

您可以对警告消息执行多种操作。

使用 -Wno-noexcept-type 禁用它.在许多项目中,警告消息是无用的,因为生成的对象不可能与另一个期望它使用 GCC 的 C++17 名称修饰的对象链接。如果您没有使用不同的 -std= 进行编译设置并且您没有构建静态或共享库,其中违规功能是其公共(public)接口(interface)的一部分,则可以安全地禁用警告消息。

使用 -std=c++17 编译所有代码.警告消息将消失,因为函数将使用新的重整名称。

制作函数static .由于该函数不能再被另一个使用不同修饰函数的对象文件引用,因此不会显示警告消息。函数定义必须包含在所有使用它的编译单元中,但是对于像您的示例中这样的模板函数,这无论如何都是常见的。这也不适用于成员函数 static意味着别的东西。

在调用函数模板时,明确指定模板参数,以提供不具有异常规范的兼容函数指针类型。例如 call<void (*)()>(func) .您也应该能够使用 cast 来执行此操作,但 GCC 7.2.0 即使使用 -std=c++17 仍会生成警告。不会改变修饰。

当函数不是模板时,不要使用 noexcept与函数类型中使用的任何函数指针类型。这一点和最后一点依赖于这样一个事实,即只有非抛出函数指针类型会导致命名重整更改,并且可以将非抛出函数指针分配 (C++11) 或隐式转换 (C++17) 以可能抛出函数指针。

关于c++ - 处理 gcc 的 noexcept 类型警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46798456/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com