gpt4 book ai didi

c++ - VC++ 11 - std::condition_variable_any 与标准不兼容?

转载 作者:行者123 更新时间:2023-11-28 00:15:58 25 4
gpt4 key购买 nike

最近,我在 Microsoft Visual Studio 2012(配备 Visual C++ 11)上遇到了奇怪的编译问题。

我移植了大型代码库,主要是在 Linux 上开发的,同时考虑到 C++ 11 的广泛使用。尽管有一些细微的变化,但一切都运行良好。除了一件事:我得到关于 std::condition_variable::wait_for 的结果类型的奇怪错误.它的内容在这里无关紧要,因为我检查了这个并且...

引用页(上面的链接)说:

template< class Lock, class Rep, class Period >
std::cv_status wait_for(Lock&, const std::chrono::duration<Rep, Period>&)

和:

template< class Lock, class Rep, class Period, class Predicate >
bool wait_for(Lock&, const std::chrono::duration<Rep, Period>&, Predicate)

我用过std::cv_status在某些地方,我可以说,我依赖它的存在。但是,在 MSVC11 上,<conditional_variable>包含:

template<class _Lock, class _Rep, class _Period>
bool wait_for(_Lock& _Lck, const chrono::duration<_Rep, _Period>& _Rel_time)

和:

template<class _Lock, class _Rep, class _Period, class _Predicate>
bool wait_for(_Lock& _Lck, const chrono::duration<_Rep, _Period>& _Rel_time, _Predicate _Pred)

请注意第一种情况下的不同结果类型。我当时想:

Errr... what?

我立即在 Linux (g++ 4.8) 上检查了这个,这两个方法确实被正确定义了。

这是怎么回事? MS 发布了与标准不兼容的实现?

奇怪的是,我进一步调查了<condition_variable>我发现了这个:

namespace cv_status {   // names for wait returns
enum cv_status {
timeout,
no_timeout
};
} // namespace cv_status

但它是:

  • 未使用
  • 无效(*)

这是一些众所周知的错误吗?或者也许标准允许实现这样做?


(*) 标准定义 enum class cv_status , 不是 enum class cv_status::cv_status .


还有一件事:wait_for内部调用 wait_until ,看起来像这样:

bool _Res;
_Mtx_lock(&_Mtx);
_Xtrnl.unlock();
_Res = _Cnd_timedwaitX(&_Cnd, &_Mtx, _Abs_time) != _Thrd_timedout;
_Mtx_unlock(&_Mtx);
_Xtrnl.lock();
return (_Res);

因此,对结果的解释是:

  • true -> std::cv_status::no_timeout
  • false -> std::cv_status::timeout

如果有要求,那no_timeout必须定义为 1timeout作为0没关系,但我没有看到这样的东西。实际上,在 Linux 上,有:

enum class cv_status { no_timeout, timeout };

因此这些枚举器将以不同于 Windows 的方式转换为 bool 值。

最佳答案

尽管有Visual C++ 11.0的版本号,但Visual Studio 2012不支持C++11,也没有声称支持。甚至下一个版本 (Visual Studio 2013) 也没有:有一个 CTP 可以添加重要的 C++11 功能,但即便如此,支持也不完整。 Visual Studio 2015预计主要是 C++11 功能完整、语言明智,但我不确定标准库实现是否也是如此。

虽然 C++11 正在标准化,但有一点指定此函数返回 bool。正是在这一点上,Microsoft 将其添加到他们的实现中,并且由于无论如何都不支持 C++11,所以当标准更新时它根本就没有更新。

评论指出这个特定的函数已经在 VS2013 中改变了,但是,如果你想要一个 C++11 实现,那么 VS2012 和 VS2013 都做不到。

关于c++ - VC++ 11 - std::condition_variable_any 与标准不兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30292297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com