【问题标题】:non conforming return value for std::chrono::duration::operator%() in Microsoft C++ 2012Microsoft C++ 2012 中 std::chrono::duration::operator%() 的不符合返回值
【发布时间】:2013-07-21 04:50:18
【问题描述】:

我正在将一些 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) 定义为

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

即模运算符返回常见类型的持续时间。 Microsoft 的实现 (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);

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

【问题讨论】:

  • 是的,这是一个错误。它也出现在 vs2013 预览版中。您应该尽快在 ms connect 提交错误报告,以便他们及时修复 vs2013。
  • 好的,会的。同时,如果我只是修改我安装的 VS2012 的 chrono 标头是否安全?它只有两行更改。

标签: visual-studio-2012 c++11 chrono


【解决方案1】:

是的,this is a bug and the fix is available in Visual Studio 2015

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

很明显,如果我们从seconds 中减去seconds,结果就是seconds

seconds = seconds - seconds

如果我们将seconds 除以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

所以duration % duration 具有与以下相同的单位:

seconds - (seconds/seconds)*seconds

简化为seconds,而不是标量。

同样的分析解释了原因:

seconds % scalar = seconds

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-16
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 2016-07-20
    • 2017-09-25
    相关资源
    最近更新 更多