小编Jef*_*ica的帖子

计算地址差异是未定义的行为吗?

假设我执行以下操作:

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++ 中的打印堆栈

c++ language-lawyer c++11

7
推荐指数
2
解决办法
110
查看次数

如何在 CMake 中强制执行目标构建的顺序

我刚刚继承了一堆用 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之前的触发器 …

cmake

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

如何从 ArraySegment 获取字节数组

如果有人传递给我一个ArraySegment<byte> foo并且该段指向一个更大的缓冲区,那么将此段复制到一个新的缓冲区中的惯用方法是什么byte[]

我尝试访问 atfoo.Array但这似乎指向较大缓冲区的开头,而不是段的开头。

例如,较大的缓冲区可能是“blahfoobar”,ArraySegment 指向“foo”。我想得到一个byte[]只有“foo”的。

我确信它非常简单,但是来自 C++,我无法理解 C# 中使用的术语。

c#

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

从非模板基派生模板类

我正在尝试让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'引入

我是模板的新手,我缺少哪些简单的步骤?这似乎是一件很基本的事情。

c++ templates

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

将lambda放在类定义中的干净方法

我有一个在本地函数中可以正常工作的代码:

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)

有什么方法可以编写这种默认构造而无需两次指定类型?或者只是以一种更清洁的方式。

c++ lambda class class-members c++11

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

C++ 在主函数之外使用“cout”?

我不知道我是否只是使用了错误的关键字......但我在谷歌上找不到答案。我不能将我虚弱的头脑包裹在我的错误上。

这是错误的简单演示:

#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 函数中的那一行,它就可以正常工作。

有人有任何想法吗?

c++

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

如何实现std :: ops:{Add,Sub,Mul,Div}运算符之一而不移出参数?

我正在编写光线追踪器,并且希望能够减去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)

rust

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

当原始数据为const时,是否要修改指针指向的UB?

当指针的数据为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)

c++ pointers const undefined-behavior

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

带有和不带有 std:: 前缀的数学函数之间的另一个冲突

我知道这是一个非常古老的话题,但我不明白为什么它在这里表现得如此。

该程序:

#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)

所以,万一

  1. sqrt 编译器可以推导出参数/返回类型并使用此函数。
  2. std::sqrt编译器无法在std::sqrt?.. 的不同重载之间进行选择。

为什么会这样?编译时所有类型都是已知的,它到底不能推断出什么?为什么只是简单的sqrt作品(我找不到定义)?


以下可能表明正在发生某些事情:

g++ -std=c++17 …
Run Code Online (Sandbox Code Playgroud)

c++ cmath

0
推荐指数
2
解决办法
103
查看次数

为什么 C++ 中的 static 给出两个不同的值。调用函数后首先是 5,然后是 1?

下面的 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了?

c++ static static-methods

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