Microsoft C++ 2012 中 std::chrono::duration::operator%() 的返回值不一致

2024-02-28

我正在将一些 C++ 代码移植到 Windows(从 Linux/g++4.8.1),我注意到 Microsoft 对持续时间模数运算符的实现是不正确的。

简单的程序

#include <chrono>
#include <iostream>

using namespace std::chrono;

int main(void)
{
    std::cout << (milliseconds(1050)%seconds(1)).count() << std::endl;
    return 0;
}

使用 Microsoft Visual Studio 2012 编译时出现编译错误:

error C2228: left of '.count' must have class/struct/union

标准 (http://en.cppreference.com/w/cpp/chrono/duration/operator_arith4 http://en.cppreference.com/w/cpp/chrono/duration/operator_arith4) 定义为

template< class Rep1, class Period1, class Rep2, class Period2 >
typename common_type<duration<Rep1,Period1>, duration<Rep2,Period2>>::type
constexpr operator%( const duration<Rep1,Period1>& lhs,
    const duration<Rep2,Period2>& rhs );

IE。模运算符返回公共类型的持续时间。微软的实现(http://msdn.microsoft.com/en-us/library/hh874810.aspx http://msdn.microsoft.com/en-us/library/hh874810.aspx) 的定义为

template<class Rep1, class Period1, class Rep2, class Period2>
constexpr typename common_type<Rep1, Rep2>::type
operator%(
  const duration<Rep1, Period1>& Left,
  const duration<Rep2, Period2>& Right);

这会错误地返回基础持续时间存储类型。这是一个错误,还是我错过了什么?


Yes, 这是一个错误,Visual Studio 2015 中提供了修复 https://connect.microsoft.com/VisualStudio/feedback/details/794649/non-conforming-return-value-for-std-chrono-duration-operator.

它是一个实现错误的原因来自维度分析。

显然如果我们减去seconds from seconds结果是seconds.

seconds = seconds - seconds

如果我们分开seconds by seconds,结果是一个标量(标量没有单位)。

scalar = seconds / seconds

终于可以相乘了seconds通过标量并得到seconds.

seconds = seconds * scalar
seconds = scalar * seconds

在 [expr.mul]/p4 中,标准定义了模运算符:

...如果商a/b可以用结果的类型来表示,(a/b)*b + a%b等于a ...

说法略有不同:

a % b = a - (a/b)*b

So a duration % duration具有相同的单位:

seconds - (seconds/seconds)*seconds

这简化为seconds,而不是标量。

同样的分析也解释了原因:

seconds % scalar = seconds
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Microsoft C++ 2012 中 std::chrono::duration::operator%() 的返回值不一致 的相关文章

随机推荐