C++ 为什么可以';std::chrono time_point成员变量的std::atomic是否默认构造?
我有一个原子包裹一个时间点值。时间点的默认构造对我来说很好,所以我希望不需要显式地设置它。然而,在gcc中,我在没有显式设置默认值的情况下得到了一个编译器错误。下面是一个简单的例子:C++ 为什么可以';std::chrono time_point成员变量的std::atomic是否默认构造?,c++,chrono,stdatomic,C++,Chrono,Stdatomic,我有一个原子包裹一个时间点值。时间点的默认构造对我来说很好,所以我希望不需要显式地设置它。然而,在gcc中,我在没有显式设置默认值的情况下得到了一个编译器错误。下面是一个简单的例子: #include <atomic> #include <chrono> struct A { using TimePoint = std::chrono::system_clock::time_point; std::atomic<TimePoint> poin
#include <atomic>
#include <chrono>
struct A
{
using TimePoint = std::chrono::system_clock::time_point;
std::atomic<TimePoint> point;
};
int
main()
{
A a;
return 0;
}
#包括
我可以通过显式地添加默认初始化()来解决这个问题:
std::原子点{TimePoint{};
但我需要这样做似乎很愚蠢。我不明白怎么了。我注意到以10.x开头的clang和gcc并没有抱怨隐式默认值。这只是gcc旧版本的编译器错误吗?或者有没有一种比时间点的显式默认初始化更优雅的方式来处理这个问题
请注意,引用了相同的错误消息,但询问(并获得答案)线程之间共享时间点的机制。我没有问题。我特别想问的是,当显式默认构造值起作用时,隐式默认构造值为什么不起作用。回答得好@Nicol-但我要说的是libstdc++错误。
以下代码:
#include <atomic>
struct A {
A() {}
};
int main () {
std::atomic<A> a;
}
#包括
结构A{
A(){}
};
int main(){
std::原子a;
}
在gcc 8.3/9.x上给出了一个类似的错误,但在gcc 10.x上编译了w/o错误(都带有-std=c++17
)
clang8+libstdc++8.3也失败
clang+libc++编译时没有错误。在我回答中所述的条件下,我无法使用自己的类重现错误。也就是说,包含非默认可构造成员的noexcept=default
类型似乎可以进行默认初始化。所以我想一定是这个问题。
std::atomic<TimePoint> point{TimePoint{}};
#include <atomic>
struct A {
A() {}
};
int main () {
std::atomic<A> a;
}