在我的clang和libc版本中(靠近HEAD
),这个static_assert
传递:
static_assert(std::is_copy_constructible_v<std::vector<std::unique_ptr<int>>>)
当然,如果你真的试图复制构造一个唯一指针的向量,它无法编译:
../include/c++/v1/__memory/allocator.h:151:28: error: call to implicitly-deleted copy constructor of 'std::unique_ptr<int>'
::new ((void*)__p) _Up(_VSTD::forward<_Args>(__args)...);
[...]
note: in instantiation of member function 'std::vector<std::unique_ptr<int>>::vector' requested here
const std::vector<std::unique_ptr<int>> bar(foo);
^
../include/c++++/v1/__memory/unique_ptr.h:215:3: note: copy constructor is implicitly deleted because 'unique_ptr<int>' has a user-declared move constructor
unique_ptr(unique_ptr&& __u) _NOEXCEPT
我假设这种情况是因为std::vector
std::vector
和其他容器(除了std::array
)被指定具有复制构造函数。这并不取决于元素类型是否可复制。如果元素类型不可复制,则仅禁止实例化复制构造函数的定义。
因此std::is_copy_constructible_v
在容器上将始终是true
。没有办法测试定义的实例化是否具有良好的类型特征。
如果元素类型不可复制,则可以指定复制构造函数不被声明或从重载解析中排除。然而,这会带来一个权衡,这在这篇博文中有详细解释:https://quuxplusone.github.io/blog/2020/02/05/vector-is-copyable-except-when-its-not/.
简而言之,如果我们希望能够使用不完整类型的容器,例如
struct X {
std::vector<X> x;
};
然后,当容器类被实例化时,我们无法确定X
是否可复制。因此,复制构造函数的声明不能依赖于此属性。
由于C 17,该标准要求std::vector
、std::list
和std::forward_list
,但不要求其他容器在类型不完整的情况下这样工作。
为什么在堆上分配内存,而没有? 它们之间的主要区别是可以重用,而std::latch不能重用,但我找不到解释为什么前者会分配内存。
https://godbolt.org/z/P97MaK 我玩的概念和预期d::is_equality_comparable工作矢量,但它没有。 编译错误在 内部失败,而不是在受概念保护的函数边界处失败。 这是错误还是预期行为?
我需要在向量中找到max元素,所以我使用了,但我发现它是一个非常慢的函数,所以我编写了自己的版本,并设法获得更好的x3性能,下面是代码: 输出: 平均而言,要比多花费x3个时间。那么为什么我能够这么容易地创建一个更快的std函数呢?既然std这么慢,我是不是应该停止使用std并编写自己的函数呢? 注意:一开始我以为这是因为我在for循环中使用了andinteger而不是迭代器,但现在看来这并不重要
在过去的几个月里,我一直在学习C语言并使用终端。我的代码使用g和c11编译并运行得很好,但在过去几天里它开始出现错误,此后我在编译时遇到了问题。我唯一可以编译和运行的程序依赖于旧的C标准。 我第一次遇到的错误包括 尝试使用ecg$g-o stoi_试验stoi_试验编译。cpp-std=c 11 大堆cpp:13:22:错误:命名空间“std”中没有名为“stoi”的成员;你是说“阿托伊”吗?in
我知道了从< code>std::async返回的< code>future具有某种特殊共享状态的原因,通过这种状态,< code >等待返回的future发生在future的析构函数中。但是当我们使用< code>std::pakaged_task时,它的未来不会表现出同样的行为。要完成打包的任务,必须从< code>packaged_task显式调用< code>future对象上的< cod