【发布时间】:2016-11-20 07:56:23
【问题描述】:
在Visual Studio 2015 中编译时,此代码始终会产生 C4554 警告。但是,g++(在 Coliru 上)编译它时没有警告。警告信息是:
警告 C4554: '
根据this,运算符- 优先于运算符
#include <array>
template<int C>
void F(std::array<int, 2 << (C-1)> const&) // 2 << (2-1) = 4
{
}
int main()
{
std::array<int,4> arr;
F<2>(arr);
}
【问题讨论】:
-
为什么要在参数声明中放置语句表达式?我很确定除了这个警告之外还有更多错误。
-
@πάνταῥεῖ :问题是,您如何让编译器充分满足以消除警告?代码的实用性尚无定论。
-
应该没有必要,但
template<int C> void F(std::array<int, (2 << (C-1))> const&)有效吗? -
没有括号组合可以使警告静音,我也无法通过将
#pragma warning(suppress: 4554)放在上面的行中来消除它。当您编写混淆代码时会发生这些事情......警告只是为了提供帮助,它不是为像您这样聪明的程序员准备的。 -
@Cody Gray:嗯,这是一个 SSCCE。我不会认为实际功能是混淆代码。我发现了一种不完全等效的hackish解决方法,但会使警告静音。只需像这样移动编译时表达式:
template<int C, int K = 2 << (C-1)> void F(std::array<int, K> const&)。我想,我应该提交一份 VC++ 错误报告,尽管它似乎不会引起太多关注。
标签: c++ c++11 visual-c++ visual-studio-2015