【发布时间】:2015-10-25 07:41:24
【问题描述】:
考虑这个经典的例子:
template <typename T, std::size_t N>
constexpr std::size_t arraySize(T (&array)[N]) noexcept { return N; }
现在这工作正常,但有一个烦恼,gcc 给出警告:
warning: unused parameter ‘array’ [-Wunused-parameter]
已知解决方案:
- 不起作用:如果我将经典的
(void)arr;添加到函数中,我会得到error: body of constexpr function ‘...‘ not a return-statement。 - 不满意:我可以有
arraySize(T (&)[N]),但我想命名参数有两个原因:- 它使编译器错误消息更易于理解。
- 更主观地说,我认为它使代码更清晰,尤其是对于那些不喜欢这种语法的人。
- 不好:在这个特定的例子中,我也可以
return sizeof(array)/sizeof(array[0]);,但这种方法不是通用的解决方案,而且我认为return N;更好,肯定更容易看到。 - 很好,但并非总是可行:切换到使用 C++14 和完全支持它的编译器。那么像
{ (void)array; return N; }这样的constexpr函数体是允许的。
如何在使用 C++11 时很好地消除未使用参数警告?
【问题讨论】:
-
我不在我的笔记本电脑前,但简单地使用
arraySize(T*)(没有名字你不需要它)不能解决吗?当然,用正确的类型,对不起,如果我不能为你试一试...... -
arraySize(T(&)[N])?这应该可行,但我不确定警告,因为我无法尝试。如果没问题,我会回复的。 -
哦,对不起,我的错。好吧,如果您坚持为参数命名,编译器将继续发出警告,除非您说服它关于您的解决方案项目符号 2... :-) ... 否则,请使用
return arr ? N : N;之类的东西,我'我非常有信心编译器会在运行时摆脱它而不会出现性能问题。 -
@hyde
return (void)array, N;怎么样? -
很好奇:如果 C++14 选项关闭,那么使用不带尾随返回类型的
auto不应该编译;如果 C++14 开启,那么(void)arr;应该没问题。