小编Rem*_*eau的帖子

如何使用Visual Studio 2017在Windows上构建OpenSSL?

我正在尝试使用OpenSSL,但我仍然坚持编译的步骤.OpenSSL项目有非常不友好(坏)的文档.

有没有实际帮助如何使用Visual Studio 2017在Windows上构建最新的OpenSSL版本?

我没有在官方OpenSSL网站上找到任何有用的信息.是的,互联网上有很多关于OpenSSL编译的帖子,但所有帖子都已过时.

c++ openssl build visual-studio

14
推荐指数
1
解决办法
2万
查看次数

Delphi通用嵌套类

我正在对C++和Delphi进行比较,我发现了一些棘手的东西.

这是非常简单的C++代码:

template<typename T>
class C {

 class D {
  T x;
 }

}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们认为类C是模板类(=泛型类),嵌套类D也是模板类.如果Tdouble,则x内部Ddouble.

我不能这样说:

template<typename T>
class C {

 template<typename T>
 class D {
  T x;
 }

}
Run Code Online (Sandbox Code Playgroud)

这是一个错误,因为我已经"内部" C而另一个T将是一个冲突.要修复错误,我应该使用不同的名称,例如U.

template<typename T>
class C {

 template<typename U>
 class D {
  T x;
 }

}
Run Code Online (Sandbox Code Playgroud)

在Delphi中,我可以这样写:

type
 TClassC<T> = class
  private

   type
    TClassD = class
     private 
      x: T;
    end;

 end; …
Run Code Online (Sandbox Code Playgroud)

delphi generics

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

按元素地址排序

我偶然发现了一种情况,库std::vector<T>使用用户提供的比较对象对容器(例如)进行排序。对于一种特定情况,用户实际上不想对容器进行排序,但排序是无条件发生的。

因此,为了尽量避免这种情况,我想尝试使用根据元素地址排序的比较对象。等价地,我们有:

std::vector nums{1, 5, 4};
auto cmp = [](auto& a, auto& b) { return &a < &b; };
std::sort(nums.begin(), nums.end(), cmp);
Run Code Online (Sandbox Code Playgroud)

这是“有效的”,因为std::vector<T>元素以与向量中元素相同的顺序存储在(连续)内存位置中。最终结果是,nums即使在排序之后,向量似乎也没有被改变。

但是,一旦我替换std::vector<T>std::array<T, N>,我就会遇到分段冲突(请参阅https://gcc.godbolt.org/z/9srehdbhG)。

我的第一个想法是我违反了https://en.cppreference.com/w/cpp/algorithm/sort中列出的类型要求:

  • RandomIt必须满足ValueSwappableLegacyRandomAccessIterator的要求。
  • 解除引用的类型必须满足MoveAssignableMoveConstructibleRandomIt的要求。
  • Compare必须满足Compare的要求。

我的假设是元素的地址在整个排序过程中保持稳定 - 这几乎肯定是错误的。

那么,std::sort()我违反了哪些要求/先决条件?

c++ language-lawyer compiler-bug

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

C++ 11中的std :: nextafter()如何产生比std :: numeric_limits :: min更小的值?

我只是注意到std::nextafter(0, 1)在我的系统上似乎产生一个大于0且小于0的值std::numeric_limits::min().

这怎么可能?我认为min()返回大于0的最小可能数.

#include <iostream>

int main(int argc, char *argv[])
{
    double next = std::nextafter(0.0, 1.0);
    double min = std::numeric_limits<double>::min();
    std::cout << "next: " << next << "\nmin:  " << min << "\nnext<min: " << (next < min) << "\nnext>0:   " << (next > 0.0) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

输出:

next: 4.94066e-324
min:  2.22507e-308
next<min: 1
next>0:   1
Run Code Online (Sandbox Code Playgroud)

我的编译器是MinGW 5.3.0 32bit.

c++ c++11

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

什么是 C++ 中的可追踪指针?

试图理解 ISO 标准 c++ 中的第 20 条:

更改:对垃圾收集区域的支持最少。

基本原理:新功能需要。

对原始特性的影响:有效的 C++ 2003 代码,在没有可追踪指针支持的情况下编译,使用声明可达的区域与较新的 C++ 代码交互可能具有不同的运行时行为。

https://timsong-cpp.github.io/cppwp/n4618/diff.cpp03.utilities

什么是可追踪指针(不是可追踪指针对象)?可追踪指针和普通指针有什么区别?

c++ c++11

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

如何在 std::pair 中转发不可移动对象

std::pair当 a 包含不可移动的内容时,我无法弄清楚完美转发 a 的语法。

#include <mutex>
#include <list>
#include <utility>

struct A
{
    A(int x)
    {

    }
};

int main()
{
    std::list<std::pair<std::mutex, std::mutex>> v;
    v.emplace_back(); // ok

    std::list<std::pair<A, A>> v2;
    v2.emplace_back(3, 4); // ok

    std::list<std::pair<A, std::mutex>> v3;
    v3.emplace_back(3, std::forward<std::mutex>(std::mutex{})); // help
}
Run Code Online (Sandbox Code Playgroud)

c++

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

为什么可以从 const std::Optional 中进行 std::move 值?

为什么下面的代码片段是合法的 C++ 代码?这是一个纯粹的理论问题 - 我没有想到任何用例:

#include <optional>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> v{1, 2, 3};
    const std::optional<std::vector<int>> ov = v;
    const auto nv = std::move(ov.value());

    for (const auto& x : *ov) { std::cout << x; }
    for (const auto& x : nv) { std::cout << x; }
}
Run Code Online (Sandbox Code Playgroud)

这产生了123123,但我不明白原因。

  1. 为什么 astd::move应用于 a 的值const optional
  2. 为什么optional ov仍然持有vector

是否ov.value()在内部创建一个临时副本,然后从中移动?

c++ stdmove stdoptional

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

从文件中删除多个BOM

我使用的是一个Javascript文件,它是其他JavaScript文件的串联.

不幸的是,将这些JavaScript文件连接在一起的人在读取文件时没有使用正确的编码,并允许将每个JavaScript文件的BOM写入连接的JavaScript文件.

有没有人知道搜索连接文件并删除任何/所有BOM标记的简单方法?

对Mac OSX使用PHP或bash脚本会很棒.

unicode byte-order-mark

12
推荐指数
2
解决办法
5546
查看次数

参数包未使用"..."展开

我有这个代码:

#include <iostream>
using namespace std;

int print(int i)
{
    cout << endl << i;
}

template<typename ...Args>
inline void pass(Args&&...args)
{

}

template<typename ...args>
inline void expand(args&&... a)
{
    print(a) ...; //this doesn't expand
    //pass( print(a)... ); this works
}

int main() {
    expand(1,2,3,4);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它抛出一个错误:

 In function 'void expand(args&& ...)':
error: expected ';' before '...' token
  print(a) ...;
           ^
parameter packs not expanded with '...':
  print(a) ...;
              ^
Run Code Online (Sandbox Code Playgroud)

为什么要使用这个pass()功能?

c++ variadic-functions variadic-templates c++14

12
推荐指数
2
解决办法
1万
查看次数

CPUID 如何在混合架构上工作?

我想知道当前处理器上的二级缓存大小是多少。幸运的是,有一个名为的库cpu_features可以实现这一点,甚至更多。在内部,它使用cpuid指令来获取所有这些信息。

我想知道,如果我尝试在混合架构(例如 Alder Lake)上使用它会发生什么?其效率和性能核心具有不同的特点。我假设该cpuid指令返回有关当前线程运行的核心的信息。所以基本上,如果它被安排在性能核心上运行,它会描述性能核心。

这样做的问题是操作系统可以决定稍后将线程移动到效率核心,在这种情况下,从中接收到的任何信息都cpuid不再正确。并且该程序甚至不知道它已被迁移。这可以通过手动将线程“固定”到核心并设置其亲和力来解决。为了区分性能和效率核心,我可以按顺序将线程固定到每个核心,并比较cpuid.

不过,我想知道cpuid结果是否确实依赖于核心,以及是否有更好的方法来查询有关处理器的信息,而无需循环遍历所有核心,只需将它们分类为其中一个两类。

c++ x86 cpu-architecture cpuid

12
推荐指数
0
解决办法
186
查看次数