GCC 8 无法编译make_shared<volatile int>()
GCC 8 fails to compile make_shared<volatile int>()
这段代码编译干净,适用于我尝试过的所有编译器,除了GCC 8(和当前的GCC主干(:
std::make_shared<volatile int>(0)
我想知道:
- GCC 8 拒绝此代码是否正确?
- 是否有GCC 8将接受的替代品(具有相同的语义和性能(? 我知道
std::atomic
,但语义不一样,所以使用它而不是volatile
的建议不是我想要的。
在这里看到它: https://godbolt.org/z/rKy3od
根据标准语言,这是一个libstdc++不符合项。
这可能是一个错误。make_shared
使用标准分配器调用allocate_shared
,std::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)...);
}
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 在一个读写器队列中,我可以用volatile替换原子吗
- GCC 8 无法编译make_shared<volatile int>()
- 不能使这种类型的"void(C::* volatile)(int) const "在参考手册C++示
- 如何使用"asm volatile"编写 btr 指令
- 未能优化看似明显的循环不变量(但volatile限定符发挥了神奇的作用)
- 读取互斥对象范围之外的volatile变量,而不是std::atomic
- 你能从"volatile const char*"构造一个字符串吗?(不使用`const_cast`
- volatile, std::sig_atomic_t, and atomic_signal_fence
- 如何显式调用运算符<<
- 为什么std::atomic中的所有成员函数都同时出现在有volatile和没有volatile的情况下
- 了解C++中的'volatile'关键字
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;