【问题标题】:Why std::atomic is not trivial type in only Visual C++?为什么 std::atomic 仅在 Visual C++ 中不是普通类型?
【发布时间】:2018-02-14 18:56:22
【问题描述】:

Folly 库要求 std::atomic<hazptr_obj*> 应该是一个普通类型。这适用于 gcc 和 clang,但不适用于 Visual C++,即使是 std::atomic<int>。为什么std::is_trivial 会返回false

#include <type_traits>
#include <atomic>

static_assert(
    std::is_trivial<std::atomic<int>>::value,
    "std::atomic<int> not trivial");

【问题讨论】:

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


【解决方案1】:

std::atomic 曾经是微不足道的(这需要 Trivially Copyable),但现在不再是了。请参阅this answer,了解有关更改方式和原因的详细说明。

至少在 C++17 中,这使得 VC 兼容,而 gcc 和 clang 不兼容。由于委员会认为这是一个缺陷,VC 也显示了 C++11 和 C++14 的预期行为。

为了以后参考,相关缺陷为DR #1734,可以查看clanghere的实现状态。我不知道 gcc 的等效状态页面。

【讨论】:

    【解决方案2】:

    【讨论】:

    • 我对 Folly 库一无所知,但对某些编译器有断言但并非所有编译器似乎都显然是错误的。要么库依赖于琐碎,在这种情况下,断言应该保留并防止在更正的工具链上构建,直到库被更改为与新行为一起正常工作(尽管它应该移动,因此它不会影响仅包含文件的用户) ,或者库不需要琐碎,在这种情况下,所有编译器的断言都是错误的。我错过了什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 2012-03-22
    • 2021-06-16
    • 2017-01-17
    相关资源
    最近更新 更多