无法摆脱C4554的警告

时间:2016-07-17 18:06:00

标签: c++ c++11 visual-c++ visual-studio-2015

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);
}

2 个答案:

答案 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