假设我有这个跨平台的程序
#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) 第一个例子
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,为什么在第二个例子中没有这样的行为?
更新:出现了 新问题.
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.
可能有人可以发现2.1和2.2之间的区别?
鉴于lambda:
auto f = [](const T& var){ return var; };
Run Code Online (Sandbox Code Playgroud)
为什么返回类型f是T(不const T&)?这个标准在哪里?
我正在解析以制表符分隔的值:
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()和其他的方法呢?
在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)
如果我按下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) 更新对不起,伙计们,我错误地确定了问题.一切正常,错误在于"其他程序逻辑".请删除或关闭问题.
Qt5用于在任何指令之前加载libeay32.dll和ssleay32.dll启动程序main()(因为它是静态的).
(详情:它位于qtbase\src\network\ssl\qsslsocket_openssl_symbols.cpp:
static QPair<QSystemLibrary*, QSystemLibrary*> loadOpenSslWin32()
Run Code Online (Sandbox Code Playgroud)
)
问题:
libeay32.dll并且ssleay32.dll驻留在它的exe目录中Qt按此顺序加载搜索dll(from qtbase\src\corelib\plugin\qsystemlibrary.cpp):
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?可能是某人已经面临这个问题...... …
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.可能是函数体在某些情况下是不正确的.
为什么委员会决定不与模板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?没有回答.
为什么下面的程序不能编译?
注意: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)