小编eye*_*ash的帖子

无条件创建指向向量最后一个元素的指针合法吗?

我有以下 C++ 代码:

void bar(int&);
void baz();

void foo(std::vector<int>& v) {
    int* pointer_to_last = v.data() + (v.size() - 1);
    if (v.size() > 0 && *pointer_to_last == 42) {
        bar(*pointer_to_last);
    } else {
        baz();
    }
}
Run Code Online (Sandbox Code Playgroud)

我无条件创建一个指向向量最后一个元素的指针,但仅当向量不为空时才取消引用该指针。根据标准,这是否合法,或者上面的代码是否包含未定义的行为?

如果上面的程序合法,那么下面的程序也合法吗?

void bar(int&);
void baz();

void foo(std::vector<int>& v) {
    int& reference_to_last = v.back();
    if (v.size() > 0 && reference_to_last == 42) {
        bar(reference_to_last);
    } else {
        baz();
    }
}
Run Code Online (Sandbox Code Playgroud)

参考说std::vector::back​

回调空容器会导致未定义的行为。

所以我假设这个程序不合法。是否有 GCC 或 Clang 的编译器标志或任何静态分析器可以对上述代码发出警告?

c++ pointers reference pointer-arithmetic undefined-behavior

5
推荐指数
1
解决办法
118
查看次数

如何将字符串拆分为第一个字符和其余字符?

这是我目前拥有的代码:

fn split_first_char(s: &str) -> Option<(char, &str)> {
    let mut char_indices = s.char_indices();
    let (_, c) = char_indices.next()?;
    let i = match char_indices.next() {
        Some((i, _)) => i,
        None => s.len(),
    };
    Some((c, s.split_at(i).1))
}
Run Code Online (Sandbox Code Playgroud)

有没有更简单或内置的方法可以做到同样的事情?

string rust

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

如何转义包含指令中的字符?

假设我有一个名为a"b.hor的头文件a>b.h,如何转义包含指令中的"or字符?>

// this does not work
#include "a\"b.h"
Run Code Online (Sandbox Code Playgroud)

c c++ include c-preprocessor

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

在哪些编程语言中,类型被视为值?

Zig 编程语言提倡“类型即值”的概念,这对我来说似乎是一个非常强大的概念,我想知道还有哪些其他编程语言支持这个概念。

我知道,例如,C++ 模板可用于将类型传递给函数,但类型仍然与 C++ 中的值不同。

templates types programming-languages zig

0
推荐指数
1
解决办法
237
查看次数