相关疑难解决方法(0)

使用数组向量的正确方法

有人能说出使用数组向量的正确方法是什么?

我声明了一个数组(vector<float[4]>)的向量,但error: conversion from 'int' to non-scalar type 'float [4]' requested在尝试时得到resize了.出了什么问题?

c++ arrays vector stdvector

58
推荐指数
4
解决办法
11万
查看次数

在 std::vector 中使用 C 风格数组 - MSVC bug?

我目前正在尝试在 C++20 下构建遗留代码库,我遇到了这样的事情:

\n
size_t someCount; // value comes from somewhere else\n\xe2\x80\xa6\nstd::vector<const char *[2]> keyValues(someCount);\n
Run Code Online (Sandbox Code Playgroud)\n

我不能轻易地将其更改为类似的内容,std::vector<std:array<const char *, 2>>因为它稍后会传递给我无法控制的某个 API。只要我不启用 C++20,上述令人厌恶的内容就可以在 Clang 和 GCC 甚至 MSVC 中正常编译,但它会在 C++20 中的 MSVC 中中断,正如您在Godbolt 中看到的那样

\n

我认为这与是否使用上述构造函数的DefaultInsertable要求有关(这实际上是标准强制执行的T唯一要求)。根据 cppreference(请参阅前面的链接),C++17 之前的 STL 实现使用放置 new 来默认构造元素,从 C++20 开始,用于类型。这可能会触发 MSVC 从 C++17 回归到 C++20。std::construct_atDefaultInsertable

\n

标准规定DefaultInsertable如果该表达式格式良好,则为类型:

\n
allocator_traits<A>::construct(m, p)\n
Run Code Online (Sandbox Code Playgroud)\n

所以就我而言,那就是:

\n
const char * dummy[2];\nusing Allocator = std::allocator<const char *[2]>;\nAllocator a;\n// …
Run Code Online (Sandbox Code Playgroud)

c++ visual-c++ language-lawyer c++20

16
推荐指数
1
解决办法
940
查看次数

标签 统计

c++ ×2

arrays ×1

c++20 ×1

language-lawyer ×1

stdvector ×1

vector ×1

visual-c++ ×1