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) 在一个简单的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) 我正在使用带有 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::single用std::views::iota(a,b)或替换嵌套std::views::empty<int>,则行为完全没问题。
您知道这是否是正确的预期行为(以及为什么)?
编辑
std::ranges::next(v.begin()) == …
由于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)