Cnas认可标识的使用:std::vector使用不是默认可构造的类

我在几个地方读过 std::vector 要求它的模板参数是默认可构造的。今天我只是用我的一个类尝试了它,它有一个deleted 默认构造函数,令我惊讶的是它似乎工作得很好(使用 std::vector 的默认构造函数)。这是可移植的行为,还是这是 gcc 的 STL 的实现细节,我应该假设 vector 要求它的模板参数

20

在 C++ 11 中有两个vector<T>成员需要一个默认的可构造T

explicit vector(size_type n);
void resize(size_type sz);

所以如果你使用这些签名,你需要有一个默认的可构造类型,否则你没有。

15

C ++ 03 中的要求是存储在容器中的类型为CopyConstructibleAssignable(请参见 § 23.1 容器要求)。但是,在 C ++ 11 中,这些要求是宽松的,并且倾向于应用于在容器上执行的操作。因此,简单的默认构造没有要求(请参见 teble 96,C ++ 11 标准中的 § 23.1)。

只要您尝试复制一个向量,或将元素插入其中,您就会满足CopyInsertableCopyAssignableEmplaceConstructibleMoveInsertableMoveAssignable等要求

7

std::vector不会无条件地要求其元素类型是可默认构造的。

std::vector(C++ 98,C++ 03) 的原始规范甚至从未尝试在内部默认构造其元素。所有新元素总是从“从外部”(由调用代码) 作为参数提供的对象复制构造的。这意味着每次您需要在向量中复制默认构造的元素时,它都是您的代码的端(它的默认构造)

例如,当你在 C ++ 98 中做这样的事情时

std::vector<some_type> v(42);
v.resize(64);

它实际上扩展到

std::vector<some_type> v(42, some_type(), allocator_type());
v.resize(64, some_type());

换句话说,默认构造的“原始”元素由调用代码提供给 vector 的构造函数,而不是由 vector 在内部创建。

C ++ 11 改变了这一点,现在std::vector具有在内部执行其元素的默认构造的方法。这仍然不无条件地要求向量元素是可默认构造的。这只是意味着您需要可默认构造的元素来使用那些特定的std::vector的方法。

4

嗯,模板在某种意义上是弱类型的。也就是说,缺少的默认构造函数不会被检测到,直到你的代码调用它使用的方法,也许在内部-这将给出一个编译时错误。

但是,除非你没有接触内部使用默认构造函数的方法,否则你是“安全的”。但是,我不知道哪个是“安全”子集,我怀疑它不是由标准定义的。例如:向量复制可能使用resize,这反过来可能使用默认构造函数。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(959)
东北男同志chinese:东北方至经纬度(eastings northings to lat long)
上一篇
Cdr文件可以用什么软件打开:可以用googlesheetsapi直接打开excel文件吗
下一篇

相关推荐

  • linux切换到超级用户:```shecho 'Hello World' > hello_world.txt```

    Linux切换到超级用户的方法有两种:使用su命令:…

    2023-03-24 09:03:15
    0 91 45
  • cv树洞柒夜事件CV树洞中的秘密与惊奇

    cv树洞柒夜事件是一个有趣的计算机视觉活动,它提供了一种新的方式来利用计算机视觉技术来探索和发现景观。它始于2020年7月,由一群热爱计算机视觉的研究者和开发者发起,他们希望通过使用机器学习技术来探索景观中的精彩之处。cv树洞柒夜事件的目标是使用机器学习技术来探索景观中的精彩之处,并利用这些发现来改善景观设计。参与者需要使用机器学习技术来探索景观,并利用这些发现来改善景观设计。参与者可以使用Python,OpenCV,TensorFlow等技术来完成任务,并将其发布在GitHub上。…

    2023-01-09 12:42:42
    0 93 89
  • code键 A Guide to Success

    示例示例code键是一个特殊的键,它可以用来输入代码。它通常位于键盘的右上角,并且有一个特殊的图标,如“#”或“@”。下面是一个简单的代码示例,使用code键来输入代码:…

    2023-03-24 02:28:58
    0 64 51
  • cvt变速箱异响:排查CVT变速箱异响的方法

    cvt变速箱异响是指变速箱在运行时发出的异常噪音,这种异响可能是由于变速箱内部零件磨损、油质不佳或润滑不良等原因引起的。代码如下:…

    2023-02-13 07:48:44
    0 31 26
  • cheers for还是to:Cheers to a Bright Future!

    示例示例Cheers for和to都可以用来表达祝福或者庆祝的意思。Cheers for:表示对某人或某事的支持,是一种赞扬的表达方式。…

    2023-02-27 02:56:18
    0 31 41
  • css初始化样式:This is a Title

    示例示例CSS初始化样式是指在各浏览器中重置默认的样式,以便于在所有浏览器中保持一致的显示效果。下面是一个常用的CSS初始化样式代码:…

    2023-01-12 02:04:17
    0 55 13
  • for循环continue:How to Use the continue Statement in a for Loop

    示例示例for循环是让程序跳过当前循环,继续下一次循环。代码示例:…

    2023-02-26 12:04:08
    0 79 72
  • linux使用yum安装httpd:如何使用yum安装Apache HTTP Server (httpd)

    使用yum安装httpd:打开终端,输入以下命令:…

    2023-01-11 11:09:38
    0 78 19

发表评论

登录 后才能评论

评论列表(50条)