小编vla*_*don的帖子

如何测试std :: random_device的随机性?

假设我有这个跨平台的程序

#include <random>
#include <iostream>

int main()
{
    std::random_device rd;
    std::cout << "rd.entropy = " << rd.entropy() << std::endl;
    std::uniform_int_distribution<int> dist(0, 9);

    for (int i = 0; i < 10; ++i) {
        std::cout << dist(rd) << " ";
    }
    std::cout << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

在Linux Mint 17.1上g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2它始终生成随机数:

$ g++ -std=c++11 testrd.cpp -o testrd
$ ./testrd
rd.entropy = 0
9 2 6 0 8 1 0 2 3 8 
$ ./testrd
rd.entropy = 0
3 6 2 …
Run Code Online (Sandbox Code Playgroud)

c++ random cross-platform c++11

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

为什么这两个右值引用示例有不同的行为?

第一个例子

int a = 0;
auto && b = ++a;
++a;
cout << a << b << endl;
Run Code Online (Sandbox Code Playgroud)

版画 22

第二个例子

int a = 0;
auto && b = a++;
++a;
cout << a << b << endl;
Run Code Online (Sandbox Code Playgroud)

版画 20

问题: 为什么在第++a3行的第一个例子中也增加b,为什么在第二个例子中没有这样的行为?

更新:出现了 新问题.

c++ rvalue-reference

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

C++ 11接口纯虚析构函数

UPD.有一个标记,它是这个问题的副本.但在那个问题中,OP问如何使用default来定义纯虚拟析构函数.这个问题是关于有什么区别的.

在C++(如果可能的话,最新标准)中,使用空体实现定义纯虚拟析构函数和仅使用空体(或默认值)之间的真正区别是什么?

变式1:

class I1 {
public:
    virtual ~I1() {}
};
Run Code Online (Sandbox Code Playgroud)

变式2.1:

class I21 {
public:
    virtual ~I21() = 0;
};

I21::~I21() {}
Run Code Online (Sandbox Code Playgroud)

变式2.2:

class I22 {
public:
    virtual ~I22() = 0;
};

I22::~I22() = default;
Run Code Online (Sandbox Code Playgroud)

更新我发现Variant 1和Variants 2.1/2.2之间至少有1个区别:

std::is_abstract::value适用false于变体1,true适用于变体2.1和2.2.

Demo

可能有人可以发现2.1和2.2之间的区别?

c++ pure-virtual language-lawyer virtual-destructor

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

为什么lambda删除cv和ref?

鉴于lambda:

auto f = [](const T& var){ return var; };
Run Code Online (Sandbox Code Playgroud)

为什么返回类型fT(不const T&)?这个标准在哪里?

c++ lambda language-lawyer c++11 return-type-deduction

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

如何加快UTF-8字符串处理速度

我正在解析以制表符分隔的值:

pub fn parse_tsv(line: &str) -> MyType {
    for (i, value) in line.split('\t').enumerate() {
        // ...
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

perf顶部包含str.find.当我查看生成的汇编代码时,有很多与UTF-8编码符号相关的工作&str.

它相对来说很慢.它需要99%的执行时间.

但要发现\t我不能简单地\t在UTF-8字符串中搜索一个字节.

我究竟做错了什么?Rust stdlib做错了什么?

或者也许在Rust中有一些字符串库,它可以简单地用"u8"字节表示字符串?但所有的split(),find()和其他的方法呢?

string find rust

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

Visual Studio 2017:linux项目中的模糊符号size_t

在Visual Studio 2017中创建Linux项目并插入using namespace std;源代码时,如下所示:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    size_t i = 1;
    string s = to_string(i);
    cout << i << s << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

VS强调size_t并说这是一个模糊的符号.VS pic 1

如果我按下F12(Go to definition),它会为我提供两个定义位置:

stddef.h

(C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\Linux\include\usr\include\x86_64-linux-gnu\5\include\stddef.h):

// ...
namespace std
{
  typedef __SIZE_TYPE__     size_t;
// ...
Run Code Online (Sandbox Code Playgroud)

c++config.h

(C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\Linux\include\usr\include\x86_64-linux-gnu\c++\5\bits\c++config.h):

// ...
#if !(defined (__GNUG__) && defined …
Run Code Online (Sandbox Code Playgroud)

c++ visual-studio-2017

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

强制Qt5从exe dir加载SSL dll

更新对不起,伙计们,我错误地确定了问题.一切正常,错误在于"其他程序逻辑".请删除或关闭问题.

Qt5用于在任何指令之前加载libeay32.dllssleay32.dll启动程序main()(因为它是静态的).

(详情:它位于qtbase\src\network\ssl\qsslsocket_openssl_symbols.cpp:

static QPair<QSystemLibrary*, QSystemLibrary*> loadOpenSslWin32()
Run Code Online (Sandbox Code Playgroud)

)

问题:

  • 我的程序开始时不是它的exe目录作为工作目录
  • libeay32.dll并且ssleay32.dll驻留在它的exe目录中
  • 用户无法在系统目录中安装OpenSSL
  • 用户无法更改PATH变量
  • 我无法重新编译Qt,即使用openssl-linked编译的静态Qt发送程序

Qt按此顺序加载搜索dll(from qtbase\src\corelib\plugin\qsystemlibrary.cpp):

  1. 申请路径.
  2. 系统库路径.
  3. 尝试PATH环境变量中的所有路径.

1号是应用程序路径,但事实上它并不在那里搜索.

我的节目:

int main()
{
    // at this point Qt5 already checked and tried to load the DLLs

    // so this:

    ChangeCurrentWorkingDirectoryToExeDir(); // some function to change cwd to current exe dir 

    // does not work :-(

    // ... other program logic ..
}
Run Code Online (Sandbox Code Playgroud)

如何在更改工作目录后强制Qt5重新加载OpenSSL DLL?可能是某人已经面临这个问题...... …

c++ windows dll qt qt5

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

const或ref或const ref或value作为setter函数的参数

Constantness

class MyClass {
// ...
private:
    std::string m_parameter;
// ...
}
Run Code Online (Sandbox Code Playgroud)

通过按值:

void MyClass::SetParameter(std::string parameter)
{
    m_parameter = parameter;
}
Run Code Online (Sandbox Code Playgroud)

传址参考:

void MyClass::SetParameter(std::string& parameter)
{
    m_parameter = parameter;
}
Run Code Online (Sandbox Code Playgroud)

传址常量-REF:

void MyClass::SetParameter(const std::string& parameter)
{
    m_parameter = parameter;
}
Run Code Online (Sandbox Code Playgroud)

传址常量值:

void MyClass::SetParameter(const std::string parameter)
{
    m_parameter = parameter;
}
Run Code Online (Sandbox Code Playgroud)

传址通用-REF:

void MyClass::SetParameter(std::string&& parameter)
{
    m_parameter = parameter;
}
Run Code Online (Sandbox Code Playgroud)

传址常量万能-REF:

void MyClass::SetParameter(const std::string&& parameter)
{
    m_parameter = parameter;
}   
Run Code Online (Sandbox Code Playgroud)

哪种变体最好(可能就C++ 11及其移动语义而言)?

PS.可能是函数体在某些情况下是不正确的.

c++ parameter-passing c++11

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

为什么C++ 11中没有模板化的typedef?

为什么委员会决定不与模板typedef一起批准using

template <class T>
using my_vector = std::vector<T>;
Run Code Online (Sandbox Code Playgroud)

是合法的.

template <class T>
typedef std::vector<T> my_vector<T>;
Run Code Online (Sandbox Code Playgroud)

是非法的?

UPD.问题为什么C++ 11没有模板typedef?没有回答.

c++ templates typedef using c++11

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

如果没有 noexcept 移动构造函数,为什么带有 std::vector 的代码不能编译,但带有 std::unique_ptr 的代码可以编译?

为什么下面的程序不能编译?

注意:something_t 的移动构造函数不是 noexcept。

#include <memory>
#include <vector>

class something_t {
public:
    constexpr something_t() = default;

    constexpr something_t(const something_t& other)
        : field_(other.field_) {
    }

    constexpr something_t(something_t&& other)
        : field_(other.field_) {
    }

private:
    unsigned int field_{ 0 };
};

struct data_t {
    something_t something;
    std::vector<std::unique_ptr<int>> move_only; // <-- this line
};

int main() {
    std::vector<data_t> result;
    data_t data;
    result.push_back(std::move(data));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误是(在 g++ 中):

/usr/include/c++/9/bits/stl_uninitialized.h:127:72: error: static assertion failed: result type must be constructible from value type of input range …
Run Code Online (Sandbox Code Playgroud)

c++ c++17

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