小编Urw*_*ald的帖子

函数调用中 std::array 中元素的确切数量

我有一个需要std::array给定大小的函数N

void func(std::array<int,3> x) {
  // do something
}

int main() {
  func({4,4,4}) // works
  func({4}) // works as well
}
Run Code Online (Sandbox Code Playgroud)

我理解为什么第二个调用也有效,我的问题是:有没有办法在编译时检查我实际传递了多少参数?

背景:我不想允许第二次调用,我希望用户准确传递N参数。

c++ metaprogramming stdarray

9
推荐指数
1
解决办法
178
查看次数

使用 std::for_each 和 std::views::iota 的并行 for 循环

我想使用std::views.

为了按顺序运行,代码如下所示:

int main() {

    //pseudo-random numbers

    random_device rd;
    default_random_engine eng(rd());
    uniform_int_distribution<int> distr(0, 100);

    auto r = ranges::views::iota(0, 10);
    vector<double> v(10, 1);
    for_each(r.begin(), r.end(), [&](int i) {v[i] = distr(eng); });
    for (auto&& i : v) cout << i << " "; cout << endl;
}
Run Code Online (Sandbox Code Playgroud)

这很好用。我使用的是标准版本std::for_each(),而不是命名空间中的版本ranges,因为它们没有执行策略。现在是并行版本。唯一的区别:

for_each(execution::par, r.begin(), r.end(), [&](int i) {v[i] = distr(eng); });
Run Code Online (Sandbox Code Playgroud)

MSVC 报错:

error C2338: Parallel algorithms require forward iterators or stronger
Run Code Online (Sandbox Code Playgroud)

我在这里发现了类似的问题:Usingranges::view::iota inparallelalgorithm,我实现了那里提供的解决方案:

    auto r = views::iota(0) …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm visual-c++ c++20 std-ranges

5
推荐指数
2
解决办法
1885
查看次数

重载赋值运算符和零规则

我已经编写了一个模板类A<T>,并且正在利用零规则(我让编译器生成析构函数、复制/移动构造函数和赋值运算符重载)。但是,我现在需要一个自定义的赋值运算符,它采用不同的类型B<T>作为参数:

A<T>& operator=(const B<T>& rhs);
Run Code Online (Sandbox Code Playgroud)

此实现会阻止编译器生成默认析构函数等吗?我的猜测是否定的,因为编译器生成

A<T>& operator=(const A<T>& rhs);
Run Code Online (Sandbox Code Playgroud)

这与我想要实现的重载完全不同。

c++ overloading operators

4
推荐指数
1
解决办法
182
查看次数

如果我知道访问地址上有哪些数据,那么越界访问数组是否是未定义的行为?

想象一下下面的定义。

struct X {
    double a[8] {0.0};
    double b[8] {0.0};
}

int main() {
    X x;
    x.a[10] = 1.0;
}
Run Code Online (Sandbox Code Playgroud)

当我访问时程序的行为是否未定义x.a[10]

c++ stack undefined-behavior

3
推荐指数
1
解决办法
388
查看次数