假设我执行以下操作:
void g(int* x)
{
int y = 0;
auto diff = uintptr_t(&y) - uintptr_t(x);
}
void f()
{
int x = 0;
g(&x);
}
Run Code Online (Sandbox Code Playgroud)
难道diff仅仅是有明确的值,或确实发生未定义行为的代码?根据规范,代码是否保证运行良好并计算 的值diff,可能没有意义,还是调用 UB?我相信有一些关于不相关变量的东西,但无法确定它。
我对自(包括)C++ 11 以来的任何标准的答案感兴趣。
讨论来自以下评论:C++ 中的打印堆栈
我刚刚继承了一堆用 CMake 构建的糟糕的项目。我的 CMake 知识为零,我怀疑以前的维护者也有同样多的知识。
我需要强制项目之间的构建顺序。它曾经是:
=== BUILD TARGET foo1 OF PROJECT bar ...
=== BUILD TARGET foo2 OF PROJECT bar ...
=== BUILD TARGET foo3 OF PROJECT bar ...
Run Code Online (Sandbox Code Playgroud)
我必须添加一个项目和依赖项(在不同的目标中,而不是上面的目标)。但代码充满了
# don't change the library order, it will break xyz
target_link_libraries(foo3 other1 foo2 other2 foo1 other3)
Run Code Online (Sandbox Code Playgroud)
正如你可以猜到的,在我的改变之后,我现在得到了
=== BUILD TARGET foo1 OF PROJECT bar ...
=== BUILD TARGET foo3 OF PROJECT bar ...
Run Code Online (Sandbox Code Playgroud)
并且foo3由于foo2未复制/安装/任何标头而无法构建。我很确定如果我可以在问题解决foo2之前强制 CMake 触发。foo3
但是,我尝试过:
target_link_libraries(foo3 foo2)
Run Code Online (Sandbox Code Playgroud)
无济于事。我仍然看到foo3之前的触发器 …
如果有人传递给我一个ArraySegment<byte> foo并且该段指向一个更大的缓冲区,那么将此段复制到一个新的缓冲区中的惯用方法是什么byte[]?
我尝试访问 atfoo.Array但这似乎指向较大缓冲区的开头,而不是段的开头。
例如,较大的缓冲区可能是“blahfoobar”,ArraySegment 指向“foo”。我想得到一个byte[]只有“foo”的。
我确信它非常简单,但是来自 C++,我无法理解 C# 中使用的术语。
我正在尝试让Derived从Base派生:
class Base
{
public:
Base() {};
};
template <class T>
class Derived : public Base
{
public:
Derived::Derived()
{
}
};
Run Code Online (Sandbox Code Playgroud)
这给了我以下错误:
错误C3254:“派生”:类包含显式覆盖“ {ctor}”,但不派生自包含函数声明的接口
注意:请参见对正在编译的类模板实例化“派生”的引用
错误C3244:'Derived :: Derived(void)':此方法由'Unknown>'引入,而不是'Base'引入
我是模板的新手,我缺少哪些简单的步骤?这似乎是一件很基本的事情。
我有一个在本地函数中可以正常工作的代码:
struct Divider
{
public:
size_t factor;
size_t next;
};
void foo()
{
auto cmp = [](const Divider& x, const Divider& y) { return x.next > y.next; };
std::priority_queue < Divider, std::vector<Divider>, decltype(cmp)> sieve(cmp);
// ...
}
Run Code Online (Sandbox Code Playgroud)
我现在想将我的sieve变量移到一个类中。我可以写出以下怪物:
class Bar
{
inline static auto cmp = [](const Divider& x, const Divider& y) { return x.next > y.next; };
std::priority_queue < Divider, std::vector<Divider>, decltype(cmp)> sieve = std::priority_queue < Divider, std::vector<Divider>, decltype(cmp)>(cmp);
};
Run Code Online (Sandbox Code Playgroud)
有什么方法可以编写这种默认构造而无需两次指定类型?或者只是以一种更清洁的方式。
我不知道我是否只是使用了错误的关键字......但我在谷歌上找不到答案。我不能将我虚弱的头脑包裹在我的错误上。
这是错误的简单演示:
#include <iostream>
//std::cout << "hello";
int main()
{
std::cout << "hello";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译/运行时,我收到此错误:
main.cpp:3:6: 错误:命名空间“std”中的“cout”未命名类型
但是,如果我删除第一cout行,并且只允许程序执行 main 函数中的那一行,它就可以正常工作。
有人有任何想法吗?
我正在编写光线追踪器,并且希望能够减去3D向量:
use std::ops::Sub;
#[derive(Clone, Debug)]
pub struct Vec3 {
pub v: [f64; 3],
}
impl Sub for Vec3 {
type Output = Vec3;
fn sub(self, other: Vec3) -> Vec3 {
Vec3 {
v: [
self.v[0] - other.v[0],
self.v[1] - other.v[1],
self.v[2] - other.v[2],
],
}
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎有效。但是,当我尝试使用它时:
fn main() {
let x = Vec3 { v: [0., 0., 0.] };
let y = Vec3 { v: [0., 0., 0.] };
let a = x - y;
let b = …Run Code Online (Sandbox Code Playgroud) 当指针的数据为const时,更改指针指向的位置是否为未定义行为?例:
const char* p = "foo";
p = "boo";
Run Code Online (Sandbox Code Playgroud)
我相信这不是UB,因为指针本身不是const,并且我没有修改该"foo"对象。
额外的问题:并更改不是const指针的const数据?会UB吗?例:
char* const p = "foo";
(*(char**)&p) = (char*)malloc(strlen(p));
Run Code Online (Sandbox Code Playgroud) 我知道这是一个非常古老的话题,但我不明白为什么它在这里表现得如此。
该程序:
#include <vector>
#include <algorithm>
#include <cmath>
int main()
{
std::vector<double> a = {1,4,9,16};
std::transform(a.begin(), a.end(), a.begin(), sqrt); // WORKS
std::transform(a.begin(), a.end(), a.begin(), std::sqrt); // compilation error
}
Run Code Online (Sandbox Code Playgroud)
编译错误是
g++ -std=c++17 -O3 main.cpp -Wall -Wextra -pedantic
main.cpp: In function ‘int main()’:
main.cpp:10:57: error: no matching function for call to ‘transform(std::vector<double>::iterator, std::vector<double>::iterator, std::vector<double>::iterator, <unresolved overloaded function type>)’
std::transform(a.begin(), a.end(), a.begin(), std::sqrt); // compilation error
^
........
Run Code Online (Sandbox Code Playgroud)
所以,万一
sqrt 编译器可以推导出参数/返回类型并使用此函数。std::sqrt编译器无法在std::sqrt?.. 的不同重载之间进行选择。为什么会这样?编译时所有类型都是已知的,它到底不能推断出什么?为什么只是简单的sqrt作品(我找不到定义)?
以下可能表明正在发生某些事情:
g++ -std=c++17 …Run Code Online (Sandbox Code Playgroud) 下面的 static 关键字代码在调用函数之前和之后给出了两个不同的输出
#include<stdio.h>
static int count=5;
int fun()
{
count = 0;
count++;
return count;
}
int main()
{
printf("%d ", count);
printf("%d ", fun());
printf("%d ", fun());
printf("%d ", count);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:5 1 1 1
问)为什么 count 给出两个不同的值;一开始是5,调用函数后就变成1了?