小编Pas*_* H.的帖子

这是旧的C ++样式构造函数吗?

Here a piece of C++ code.

In this example, many code blocks look like constructor calls. Unfortunately, block code #3 is not (You can check it using https://godbolt.org/z/q3rsxn and https://cppinsights.io).

I think, it is an old C++ notation and it could explain the introduction of the new C++11 construction notation using {} (cf #4).

Do you have an explanation for T(i) meaning, so close to a constructor notation, but definitely so different?

struct T {
   T() { }
   T(int …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

15
推荐指数
1
解决办法
269
查看次数

生成器在 C++20 视图管道中调用两次

在一个简单的views适配器管道中,调用一个gen函数来生成一系列值(使用内部状态),然后对其进行过滤。

令人惊讶和违反直觉的(至少对我来说)是这样的事实:生成器函数在每次迭代中被调用两次,因此对同一过滤器的下一次检查失败(过滤后的值不会在管道中重用)。

您知道这是否是正确的预期行为(以及为什么)?

libstdc++在 GCC 10.3、11.1 和 trunk(代码)以及range-v3GCC 和 clang(代码)中进行了测试。

int main() {
  int n = 0;
  auto gen = [&n]() {
    auto result = ++n;
    std::cout << "Generate [" << result << "]\n";
    return result;
  };

  auto tmp =
      ranges::views::iota(0)
      | ranges::views::transform([gen](auto &&) { return gen(); })
      | ranges::views::filter([](auto &&i) {
          std::cout << "#1 " << i << " " << (i % 2) << "\n";
          return (i …
Run Code Online (Sandbox Code Playgroud)

c++ range-v3 c++20 std-ranges

7
推荐指数
1
解决办法
732
查看次数

C++20 views::join 在生成的嵌套范围上进入无限循环::single_view

我正在使用带有 GCC 实现(v10.2 和 v11)的 C++20 范围。

为了测试行为的std::views::join,我试图生成使用嵌套视图single,然后我平坦它使用join

#include <ranges>
#include <iostream>

int main() {
  auto data = std::views::single(1);
  auto v =
      data
      | std::views::transform([](const auto &s) { return std::views::single(s); })
      | std::views::join
      ;

  for (auto &&x : v) { // Infinite loop + segfault
    std::cout << x << '\n';
  }
}
Run Code Online (Sandbox Code Playgroud)

[在编译器资源管理器中]

我希望找到for 的一个迭代器具有初始值 (1)循环。但是不......它进入了一个无限循环,因为我使用了这个值,所以出现了段错误。

如果我std::views::singlestd::views::iota(a,b)或替换嵌套std::views::empty<int>,则行为完全没问题。

您知道这是否是正确的预期行为(以及为什么)?

编辑

std::ranges::next(v.begin()) == …

c++ c++20 std-ranges

6
推荐指数
0
解决办法
119
查看次数

为什么对 `const` 的可变引用不是错误?

由于Rust book v1.30明确指出:

... Rust 中的常量在内存中没有固定地址。这是因为它们有效地内联到每个使用它们的地方。由于这个原因,对相同常量的引用不一定保证引用相同的内存地址。

为什么编译器允许得到一个可变的引用上一个const变量。它只是说一个警告/注意事项,而不是一个错误。

warning: taking a mutable reference to a `const` item
 --> src/main.rs:5:22
  |
6 |     println!("{:p}", &mut VALUE);
  |                      ^^^^^^^^^^
  |
  = note: `#[warn(const_item_mutation)]` on by default
  = note: each usage of a `const` item creates a new temporary
  = note: the mutable reference will refer to this temporary, not the original `const` item
Run Code Online (Sandbox Code Playgroud)

为了测试这一点,一个简单的代码示例:

fn main() {
    const VALUE: u64 = 0;
    println!("{:p}", …
Run Code Online (Sandbox Code Playgroud)

rust

2
推荐指数
1
解决办法
184
查看次数

标签 统计

c++ ×3

c++20 ×2

std-ranges ×2

c++11 ×1

range-v3 ×1

rust ×1