我有以下 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)
回调空容器会导致未定义的行为。
所以我假设这个程序不合法。是否有 GCC 或 Clang 的编译器标志或任何静态分析器可以对上述代码发出警告?
c++ pointers reference pointer-arithmetic undefined-behavior
这是我目前拥有的代码:
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)
有没有更简单或内置的方法可以做到同样的事情?
假设我有一个名为a"b.hor的头文件a>b.h,如何转义包含指令中的"or字符?>
// this does not work
#include "a\"b.h"
Run Code Online (Sandbox Code Playgroud) Zig 编程语言提倡“类型即值”的概念,这对我来说似乎是一个非常强大的概念,我想知道还有哪些其他编程语言支持这个概念。
我知道,例如,C++ 模板可用于将类型传递给函数,但类型仍然与 C++ 中的值不同。