在Visual Studio 2015中编译时,此代码始终生成C4554警告。但是,g ++(在Coliru上)编译它没有警告。警告信息是:
警告C4554:'<<':检查操作员优先级是否存在可能的错误;用括号来说明优先顺序
根据this,operator-优先于operator<<。所以括号不应该是必需的。 (省略它们会发出相同的警告。)有人能告诉我这个警告的原因,或者如何摆脱它?
#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);
}
答案 0 :(得分:3)
你可以试试这个:
constexpr std::size_t calc_size(int param)
{
return 2 << (param - 1);
}
template<int C>
void F(std::array<int, calc_size(C)> const&) // 2 << (2-1) = 4
{
}
答案 1 :(得分:-2)
在Visual Studio 2015中,使用#pragma warning( disable : C4554 )
禁用指定的警告消息。但是,禁用警告消息是不明智的。
此处有更多文档...... https://msdn.microsoft.com/en-us/library/aa273936(v=vs.60).aspx
请参阅此链接,了解警告C4554
出现的原因......
https://msdn.microsoft.com/en-us/library/5d2e57c5.aspx