小编Den*_*kiy的帖子

为什么std :: get for variant抛出失败而不是未定义的行为?

根据投掷的cppreference std::get,如果包含的类型不是预期的类型.这意味着标准库必须检查每次访问(libc ++).variantstd::bad_variant_accessvariant

这个决定的理由是什么?为什么它不是未定义的行为,就像C++中的其他地方一样?我可以解决吗?

c++ variant c++17

19
推荐指数
3
解决办法
949
查看次数

使用const std :: unique_ptr for pimpl idiom

Herb Sutter在CppCon16的演讲中,他建议用const std::unique_ptr(约10分钟)写出pimpl习语.

这应该如何与移动构造函数/赋值一起使用?c ++ 17中有什么东西吗?我找不到任何东西.

c++ c++11 c++17

17
推荐指数
2
解决办法
1254
查看次数

为任意类型擦除实现小缓冲区优化的简单方法(如在std :: function中).

我倾向于使用类型擦除技术.它通常看起来像这样:

class YetAnotherTypeErasure
{
public:
   // interface redirected to pImpl
private:
   // Adapting function
   template ...
   friend YetAnotherTypeErasure make_YetAnotherTypeErasure (...);

   class Interface {...};

   template <typename Adaptee>
   class Concrete final : public Interface { 
     // redirecting Interface to Adaptee
   };

   std::unique_ptr<Interface> pImpl_; // always on the heap
};
Run Code Online (Sandbox Code Playgroud)

std::function做类似的事情,但它有一个小的缓冲区优化,所以如果Concrete<Adaptee>小于smth并且没有进行移动操作,它将被存储在其中.是否有一些通用的库解决方案来做到这一点相当容易?为了强制只在编译时存储的小缓冲区?也许已经提出了标准化的建议?

c++ c++11

6
推荐指数
1
解决办法
942
查看次数

ARM-SVE:包装运行时大小的寄存器

在通用 SIMD 库中,我们正在研究支持长度不可知的问题sve

但是,我们无法将sizeless寄存器包装到结构中以对其进行一些元编程。

struct foo {
  svint8_t a;
};
Run Code Online (Sandbox Code Playgroud)

有办法做到吗?要么 clang 要么 gcc。

我发现一些讨论__sizeless_struct和一些补丁到处乱飞,但我认为它没有去任何地方。我还发现了这些gcc 测试- 没有将寄存器包装在结构中。

gcc armv8 sve

2
推荐指数
1
解决办法
209
查看次数

标签 统计

c++ ×3

c++11 ×2

c++17 ×2

armv8 ×1

gcc ×1

sve ×1

variant ×1