Visual studio 2017 在Visual Studio 2017中,变量模板中的除法返回零

Visual studio 2017 在Visual Studio 2017中,变量模板中的除法返回零,visual-studio-2017,c++,c++14,division,variable-templates,Visual Studio 2017,C++,C++14,Division,Variable Templates,这可能是一个与这个问题相关的bug:而且似乎与优化器相关 在Visual Studio 2017中,a定义中的部门似乎有一个bug。例如,这段代码: template <typename T> const T PI = std::acos(static_cast<T>(-1)); template <typename T> const T ONE_EIGHTY = 180; template <typename T> const T DEG_

这可能是一个与这个问题相关的bug:而且似乎与优化器相关


在Visual Studio 2017中,a定义中的部门似乎有一个bug。例如,这段代码:

template <typename T>
const T PI = std::acos(static_cast<T>(-1));

template <typename T>
const T ONE_EIGHTY = 180;

template <typename T>
const T DEG_TO_RAD = PI<T> / ONE_EIGHTY<T>;

int main() {
    cout << DEG_TO_RAD<float> << endl;
}
模板
常数T PI=std::acos(静态_cast(-1));
模板
常数T 1_80=180;
模板
const T DEG_至_RAD=π/1_八十;
int main(){

我可以按原样测试您的代码并得到相同的结果。但是我也单独测试了
PI
&
180
,他们在输出中给了我正确的结果。所以我考虑过这一点,出于某种原因,我不知道为什么Visual Studio会这样做,这让我认为这可能是一个bug,也可能是一个错误应该留给
编译器实现设计
,但它似乎没有根据两个预定义常数的除法设置
常数

要在VisualStudio中解决这个问题,它非常简单,而且很容易被忽略;您所要做的就是用括号包装RHS表达式

template<typename T>
const T DEG_TO_RAD = (PI<T> / ONE_EIGHT<T>);
输出:

3.14159
180
0
3.14159
180
0.0174533
那么当我这样做的时候:

我在所有4种模式下都尝试过:调试/发布x86和x64,得到了相同的结果。
这在您的机器平台上可能会有所不同。

应@JonathanMee的请求在此处发布了一个解决方案,因为他之前报告的类似问题也是如此。似乎与最新VS2017中的某种缺陷有关,该缺陷阻止模板自动激活,需要强制激活:

template <typename T>
const T PI = std::acos(static_cast<T>(-1));

template <typename T>
const T ONE_EIGHTY = 180;

template <typename T>
const T DEG_TO_RAD = PI<T> / ONE_EIGHTY<T>;

int main() 
{
    PI<float>; // <---- workaround
    std::cout << DEG_TO_RAD<float> << std::endl;
}
模板
常数T PI=std::acos(静态_cast(-1));
模板
常数T 1_80=180;
模板
const T DEG_至_RAD=π/1_八十;
int main()
{

PI;//有趣..如果你尝试
cout,我也可以通过将
PI
更改为硬编码
3.14159265
并将变量模板更改为
constexpr
@AlgirdasPreidžiuh来获得正确的结果…但是没有:(尽管如此,这是一个很好的发现。
auto test2=DEG_TO_RAD;
得到了正确的结果,所以这是一个std::cout。尝试设置std::cout以获得更高的分辨率。它看起来像是一个强制转换问题,因为
std::cout-hmm;我正在使用VS2017,它在Win7 64位home premium中对我有效。您是在32位还是64位模式下编译,调试还是发布,任何sp特殊优化?哪个版本?我在15.5.7hmm上,我有旧版本15.4.4尝试在
cout
之前添加
PI;
,这对我很有用
3.14159
180
0.0174533
template <typename T>
const T PI = std::acos(static_cast<T>(-1));

template <typename T>
const T ONE_EIGHTY = 180;

template <typename T>
const T DEG_TO_RAD = PI<T> / ONE_EIGHTY<T>;

int main() 
{
    PI<float>; // <---- workaround
    std::cout << DEG_TO_RAD<float> << std::endl;
}