每当我尝试max_size()和使用size()时std::array,我得到相同的结果,我想知道是否可能存在两种情况给出不同结果的情况.
传递std::array<char, N>给这样的函数的方法是什么:
template<size_t N>
void safe_func(char (&dest)[N]);
Run Code Online (Sandbox Code Playgroud)
?
我试试这个:
#include <array>
template <size_t N> using SafeArray = char[N];
template <size_t N> void safe_func(char (&dest)[N]) {}
int main() {
SafeArray<10> a1;
safe_func(a1);
std::array<char, 10> a2;
safe_func(*static_cast<SafeArray<10> *>(static_cast<void *>(a2.data())));
}
Run Code Online (Sandbox Code Playgroud)
它有效,但我怀疑,我的演员可能有问题,而在其他编译器或平台上(我使用gcc/linux/amd64),我遇到了错误的引用?
以下代码返回下面的编译错误。我一直无法理解为什么初始化程序太多。该代码使用vector<X>. 有谁知道为什么会报告错误以及如何解决?谢谢
#include <iostream>\n#include <array>\nusing namespace std;\n\nstruct X {\n int x, y;\n};\n\nint main(int argc, char *argv[])\n{\n array<X,2> a0 = {{0,1}, {2,3}};\n\n for (auto& p : a0) {\n cout << p.x << endl;\n cout << p.y << endl;\n }\n\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n汇编:
\n\ng++ -pedantic -Wall test116.cc && ./a.out\ntest116.cc: In function \xe2\x80\x98int main(int, char**)\xe2\x80\x99:\ntest116.cc:11:34: error: too many initializers for \xe2\x80\x98std::array<X, 2>\xe2\x80\x99\n array<X,2> a0 = {{0,1}, {2,3}};\nRun Code Online (Sandbox Code Playgroud)\n std::array 可以使用特定值构造(在编译时使用较新的 C++ 版本),例如
std::array a{1, 4, 9};
Run Code Online (Sandbox Code Playgroud)
但是 - 它没有构造函数,或命名为构造函数习语的标准库,采用单个值并复制它。即我们没有:
std::array<int, 3> a{11};
// a == std::array<int, 3>{11, 11, 11};
Run Code Online (Sandbox Code Playgroud)
因此,我们如何构造一个仅给定重复值的数组?
编辑:我正在寻找一种解决方案,它甚至适用于不可默认构造的元素类型;因此,通过默认构造数组然后填充它的解决方案不是我所追求的 - 尽管事实上这适用于int(如示例中所示)的情况。
我正在寻找一种使用 SFINAE 来实现某些功能的方法,该功能必须仅适用于某些容器:向量、列表、数组(设置在下面仅作为测试)
基于这个答案,我尝试了下面的代码,该代码使用了一个仅对所需容器返回 true 的特性类。
正如您在此处在线看到的,它失败了std::array。
template <typename Container>
struct is_container : std::false_type { };
template <typename... Ts> struct is_container<std::array<Ts... >> : std::true_type { };
template <typename... Ts> struct is_container<std::vector<Ts...>> : std::true_type { };
template <typename... Ts> struct is_container<std::set<Ts... >> : std::true_type { };
template <typename... Ts> struct is_container<std::list<Ts... >> : std::true_type { };
template <typename... Ts> struct Dummy{};
int main()
{
std::cout << "Dummy: " << is_container<Dummy<int>>::value << '\n';
std::cout << "array: …Run Code Online (Sandbox Code Playgroud) 我可以使用 astd::array<int, N>来为 a 的部分别名int[]而不调用 UB 吗?
https://en.cppreference.com/w/cpp/container/array “此容器是一个聚合类型,其语义与将 C 样式数组 T[N] 作为其唯一非静态数据成员的结构体具有相同的语义。 ”
动机:copy下面的函数不受我的控制,需要通过引用进行单个分配。只有 a struct { int[N]; }like astd::array<int, N>才能进行那种“多对象赋值”?
这是UB吗?
还有别的办法吗?
#include <iostream>
#include <array>
template <std::size_t N>
void print(int (&arr)[N], std::size_t number_rows, std::size_t number_cols) {
assert(number_rows * number_cols == N);
for (std::size_t r = 0; r != number_rows; ++r) {
for (std::size_t c = 0; c != number_cols; ++c) {
std::cout << arr[r * number_cols + c] …Run Code Online (Sandbox Code Playgroud) 我想在编译时对 std::array 执行范围检查。下面是一个例子:
#include <iostream>
#include <array>
void rarelyUsedFunction(const std::array<double, 2>& input)
{
std::cout << input[5] << std::endl;
}
int main()
{
std::array<double, 2> testArray;
rarelyUsedFunction(testArray);
}
Run Code Online (Sandbox Code Playgroud)
如果我用 g++ 编译它,则没有警告或错误,尽管对不在数组中的元素进行了未定义的访问。编译后的程序只是打印一些随机值。
g++ 中是否有编译器选项可用于在编译时执行的合适的范围/边界检查?我知道我可以添加“-D_GLIBCXX_DEBUG”,但这只会在运行时执行检查。如果我有一个不经常调用的函数,则不会触发。
我知道,不能在所有情况下都执行这样的范围检查,但在上述情况下,编译器应该能够发现问题!?
std::array<uint8_t,N>我正在尝试从 a创建 a,std::span<uint8_t,N>但我找不到一种没有memcpy、或 的方法来执行此操作std::copy,或者std::ranges::copy这不能保护我免受目标数组大小的错误指定。
#include <algorithm>
#include <array>
#include <iostream>
#include <span>
int main(int argc, char **argv) {
constexpr size_t N = 10;
std::array<uint8_t, N> original;
std::span span(original); // of type std::span<uint8,N>
std::array copy1(span); // does not work
std::array<uint8_t, N> copy2(span); // does not work
std::array<uint8_t, N> copy3(begin(span), end(span)); // does not work
// ugly stuff that works, but does not protect me if I specify wrong array size
constexpr size_t …Run Code Online (Sandbox Code Playgroud) 在 C++ 中,我有这个来自 C 的结构。这段代码非常旧,无法修改:
struct Point {
double coord[3];
};
Run Code Online (Sandbox Code Playgroud)
另一方面,我有这个现代函数,它返回现代std::array而不是原始数组:
std::array<double, 3> ComputePoint();
Run Code Online (Sandbox Code Playgroud)
目前,为了Point从返回值初始化 a,我手动从 中提取每个元素std::array:
std::array<double, 3> ansArray{ComputePoint()};
Point ans{ansArray[0], ansArray[1], ansArray[2]};
Run Code Online (Sandbox Code Playgroud)
这个解决方案是可行的,因为只有三个坐标。我可以将其模板化为一般长度吗?我想要类似相反的转换:std::to_array。