GCC 8 无法编译make_shared<volatile int>()

GCC 8 fails to compile make_shared<volatile int>()

本文关键字:lt volatile gt int shared 编译 make GCC      更新时间:2023-10-16

这段代码编译干净,适用于我尝试过的所有编译器,除了GCC 8(和当前的GCC主干(:

std::make_shared<volatile int>(0)

我想知道:

  1. GCC 8 拒绝此代码是否正确?
  2. 是否有GCC 8将接受的替代品(具有相同的语义和性能(? 我知道std::atomic,但语义不一样,所以使用它而不是volatile的建议不是我想要的。

在这里看到它: https://godbolt.org/z/rKy3od

根据标准语言,这是一个libstdc++不符合项。

这可能是一个错误。make_shared使用标准分配器调用allocate_sharedstd::allocator<remove_const_t<T>>其中T是共享对象的类型。此分配器将仅用于获取底层共享对象(包含易失性 int 和原子计数器的结构(的重新绑定分配器。因此,将此基础对象声明为非常量非易失性是完全可以的。

make_shared的这个定义将起作用:

template<class T,class...Args>
auto make_shared(Args&&...args){
using ncvT= std::remove_cv_t<T>;
return std::allocate_shared<T>(std::allocator<ncvT>(),std::forward<Args>(args)...);
}