有什么理由放弃std::allocator
支持自定义解决方案?您是否遇到过正确性,性能,可扩展性等绝对必要的情况?有什么非常聪明的例子吗?
自定义分配器一直是我不太需要的标准库的一个功能.我只是想知道SO上的任何人是否可以提供一些令人信服的例子来证明他们的存在.
是否有一个git stash
命令可以存储您的更改,但也将它们保存在工作目录中?所以基本上git stash; git stash apply
一步到位?
假设我有以下内容:
#include <memory>
struct A { int x; };
class B {
B(int x, std::unique_ptr<A> a);
};
class C : public B {
C(std::unique_ptr<A> a) : B(a->x, std::move(a)) {}
};
Run Code Online (Sandbox Code Playgroud)
如果我正确理解有关"未指定函数参数顺序"的C++规则,则此代码不安全.如果B
构造函数的第二个参数首先使用移动构造函数构造,那么a
现在包含一个nullptr
表达式a->x
将触发未定义的行为(可能是段错误).如果首先构造第一个参数,那么一切都将按预期工作.
如果这是一个正常的函数调用,我们可以创建一个临时函数:
auto x = a->x
B b{x, std::move(a)};
Run Code Online (Sandbox Code Playgroud)
但是在类初始化列表中,我们没有自由创建临时变量.
假设我无法改变B
,有没有可能的方法来实现上述目标?即unique_ptr
在不创建临时的情况下解除引用并移动相同的函数调用表达式?
如果您可以更改B
构造函数但不添加新方法,该setX(int)
怎么办?那会有帮助吗?
谢谢
c++ initialization move-semantics unspecified-behavior c++11
std::function<T1(T2)>
比原版有T1 (*)(T2)
什么优势?
我有一个foo
包含整数的命名空间bar
,声明如此...
foo.h中:
namespace foo {
int bar;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我foo.h
只包含一个文件,这就可以了.但是当我foo.h
从两个或更多文件中包含时出现问题:我收到链接器错误.我想出如果我声明bar
为static
,我可以包含foo.h
在多个文件中.这对我来说似乎很奇怪,因为我不知道可以在命名空间内声明一个静态变量.(那有什么意思?)
为什么这样做?更重要的是,为什么没有它的工作没有 static
?static
在用于什么时意味着什么namespace
?
我是C++新线程的新手,我试图清楚地了解线程之间如何共享/不共享内存.我正在使用std::thread
C++ 11.从我在其他SO问题上看到的,堆栈内存只由一个线程拥有,堆内存在线程之间共享.所以从我认为我对堆栈与堆的理解,以下内容应该是正确的:
#include <thread>
using namespace std;
class Obj {
public:
int x;
Obj(){x = 0;}
};
int main() {
Obj stackObj;
Obj *heapObj = new Obj();
thread t([&]{
stackObj.x++;
heapObj->x++;
});
t.join();
assert(heapObj->x == 1);
assert(stackObj.x == 0);
}
Run Code Online (Sandbox Code Playgroud)
请原谅我,如果我搞砸了一堆东西,lambda语法对我来说是非常新的.但希望我正在努力做的是连贯的.这会像我期望的那样表现吗?如果没有,我有什么误解?
关于以下模板函数,这是关于此问题中的代码的无关问题.
template <class T>
class Object : public Container {
public:
T& object;
Object(const T& obj) : object(obj) {}
};
Run Code Online (Sandbox Code Playgroud)
这是调用构造函数的代码:
template <class T>
void Array::add_element(const T& element)
{
vec.push_back(new Object<T>(element));
}
Run Code Online (Sandbox Code Playgroud)
这段代码编译得很好,但是只要我添加一行就main
可以调用它:
Array array;
int i = 3;
array.add_element(i);
Run Code Online (Sandbox Code Playgroud)
我收到编译器警告:error: invalid initialization of reference of type 'int&' from expression of type 'const int'
.
那是什么?我通过了int
.它不应该自动转为const int&
我吗?为什么编译器会抱怨?
在 pdb 模式下,我经常想进入一个函数。这是一个说明我可能会做的事情的情况。鉴于代码:
def f(x):
print('doing important stuff..')
result = g(x) + 2
return result
def g(x):
print('some cool stuff going on here, as well')
0 / 0 # oops! a bug
return x + 5
Run Code Online (Sandbox Code Playgroud)
现在,假设我在print('doing important stuff...')
和之间设置了一个断点result = g(x) + 2
。所以现在,f(x)
看起来像这样:
def f(x):
print('doing important stuff..')
__import__('pdb').set_trace() # or something similar..
result = g(x) + 2
return result
Run Code Online (Sandbox Code Playgroud)
然后,我调用该函数f(x)
用x=5
,期待得到一个结果12
。当被调用时,我最终在f
. 命中n
会给我错误(在这种情况下是 ZeroDivisionError)。现在,我想以g(x) …
我前几天在Windows 2000上下载了一个编译器(我认为它是MinGW,但我不确定)(我通常是Mac用户,但它不是我的机器),下载器是MS-DOS命令行应用程序,它将显示下载的进度条.像这样......
|--- | 15%
...
|------ | 30%
...
...
|-------------- | 70%
Run Code Online (Sandbox Code Playgroud)
除了它会在同一行上不断更新.我假设程序通过删除以前打印的字符并重新打印不同的字符来完成此操作,但我似乎无法弄清楚如何执行此操作.
我曾试图用几种不同的方式打印'删除'字符,比如(char)8
和\b
(甚至\r
,我听说在一些语言中回溯到行的开头),但这些都没有用.
有谁知道怎么做这种东西?
编辑:此问题已成为特定于平台的问题.我想具体了解如何在Mac上完成此操作.
我正在编译以下代码:
class B;
class A {
A();
friend A B::newAObject();
};
class B {
friend A::A();
public:
A newAObject();
};
Run Code Online (Sandbox Code Playgroud)
这可能看起来很奇怪,但想法是有一个类A
只能由类型的对象B
(谁可能是单例)生成.
问题是我在这些对象之间创建了一个循环依赖.A
必须在之前定义B
,并且B
必须在之前定义A
.显然前向声明B
不够好,B
实际上必须在之前完全定义A
(反之亦然).
我该如何解决这个问题?
编辑:实际错误是:在嵌套名称说明符中命名的不完整类型"B".
注意:这里有另一篇与此类似的帖子:错误:嵌套名称说明符中使用的类型不完整,但是它非常模板化,这让我感到困惑,因此这篇文章.