【发布时间】:2018-03-29 15:15:33
【问题描述】:
考虑这个例子,来自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)
^~~~
我应该如何处理这个警告?解决方法是什么?
【问题讨论】:
-
如果
call完全在您的项目内部,那没关系。仅在两个不同的翻译单元使用它的情况下才重要,其中一个是用 C++17 编译的,一个不是。即便如此,由于call是一个模板函数,除了在最终的可执行文件中有一个额外的定义之外,它可能不会产生那么大的影响。 -
@DanielH 我不是说上面的 Barry,但是如果您使用 -wError 编译项目,那么“无害警告”将导致程序根本无法编译,尽管正确的。这很重要。
-
@markt1964 在帖子中只使用了
-Wall。如果您使用-Werror编译或尝试避免编译器错误(这是一个好主意),那么是的,您会遇到问题。可能最好通过添加-Wno-noexcept-type来解决这个问题,具体取决于具体情况。 -
@Barry,当您切换编译器版本时,您是否从头开始重建您的项目(及其所有用户)?
-
只是一个注释,但在 GCC8 中可能有 less of this warning。不确定它是否适用于您的具体情况。
标签: c++ g++ c++17 noexcept gcc7