class B;
class A
{
public:
A ()
: m_b(new B())
{
}
shared_ptr<B> GimmeB ()
{
return m_b;
}
private:
shared_ptr<B> m_b;
};
Run Code Online (Sandbox Code Playgroud)
假设B是一个在语义上不应该存在于A的生命周期之外的类,也就是说,B对于它自身存在完全没有意义.应该GimmeB退还shared_ptr<B>还是B*?
一般来说,完全避免在C++代码中使用原始指针代替智能指针是一种好习惯吗?
我认为shared_ptr只应该在有明确的转让或共享所有权的情况下使用,我认为在函数分配一些内存,用一些数据填充并返回它的情况下很少见,并且有理解在调用者和被调用者之间,前者现在对该数据"负责".
我有一个WPF窗口,WindowStyle设置为none.有没有什么方法可以强制这个窗口放下一个阴影(就像你在WindowStyle不是没有时得到的那个)?我不想将AllowTransparency设置为true,因为它会影响性能.而且我也不想禁用硬件渲染(我在某处读到透明度在禁用时效果更好).
POD struct可以在C++ 11中进行零初始化,如下所示:
SomeStruct s{};
Run Code Online (Sandbox Code Playgroud)
但是,如果我已经有一个struct的实例并且我想将它重新初始化为零,我该怎么办?以下似乎有效:
s = {};
Run Code Online (Sandbox Code Playgroud)
有人能指出相关的标准吗?我假设这是发生的事情:
右单引号(U + 2019)与Apostrophe(U + 0027)
这两个字符有什么区别?
我遇到了这个问题,我使用CAtlString从资源文件加载字符串,在某些Windows安装中,LoadString在尝试加载包含U + 2019的字符串时失败,但它适用于其他一些Windows安装.U + 2019字符出现在我从Word复制的资源文件中的字符串中,U + 0027出现在我手工编码的stirng中.为什么LoadString(有时)会阻塞它?
...
for /F %%F in ('dir /B %* 2> nul') do (
...
Run Code Online (Sandbox Code Playgroud)
我在这里尝试做的是丢弃命令的错误输出(并在stdout输出上循环).然而,它抱怨:
2> was unexpected at this time.
Run Code Online (Sandbox Code Playgroud)
这是实现这个目标的一些方法吗?
以下代码未能通过静态断言:
#include <gsl/span>
#include <iterator>
#include <type_traits>
int main()
{
int theArr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
gsl::span<int> theSpan{ theArr, std::size(theArr) };
using std::cbegin;
auto it1 = cbegin(theSpan);
auto it2 = theSpan.cbegin();
static_assert(std::is_same_v<decltype(it1), decltype(it2)>);
}
Run Code Online (Sandbox Code Playgroud)
之所以失败,是因为在容器的const ref上std::cbegin()调用了该.begin()方法。对于标准定义的容器,这将返回const_iterator,与.cbegin()返回的类型相同。但是,gsl::span它有点独特,因为它模拟了一种“借贷类型”。A的const gsl::span行为类似于const指针;span本身是const,但指向的不是const。因此,still .begin()上的方法const gsl::span仍返回非常量迭代器,而显式调用.cbegin()将返回常量迭代器。
我很好奇为什么std::cbegin()不定义为调用.cbegin()容器(所有标准容器似乎都在实现)来解决此类情况。
这与以下方面有关:std :: cbegin为什么返回与std :: begin相同的类型
64位应用程序具有超过32位应用程序的性能优势的来源是什么?我假设有一个性能优势,因为像WinRAR这样的程序做广告.
另外,我们是否可以通过切换到64位编译器来获得这些性能优势,还是需要对代码进行任何更改?
欢迎使用与非托管代码和托管代码相关的答案.
我在LaTeX中编写了一个文档,使用了两列格式,11pt,times字体.我的许多单词都显示为带连字符,并且对于每个描述列表项,我都会收到一个badbox警告(虽然输出中没有问题).我怎样才能解决这个问题?
可能是一个非常模糊和广泛的问题,但是所有C++编译器在将代码编译成机器代码之前是否先将代码编译成C?
class A {};
typedef shared_ptr<const A*> AConstPtr;
typedef shared_ptr<A*> APtr;
vector<APtr> ptr;
const vector<AConstPtr>* foo()
{
return &ptr;
}
Run Code Online (Sandbox Code Playgroud)
这段代码不能编译,因为"没有从向量<Aptr >*到const向量<AConstPtr >*的隐式转换"无论如何都可以使这个工作,而不创建一个新的向量,并且不使用不安全的转换?
我需要这个的原因是因为我有一个类在内部将列表存储为向量<APtr >,但需要通过其接口公开它的完全const版本.
c++ ×5
windows ×2
64-bit ×1
atl ×1
batch-file ×1
c ×1
c++11 ×1
casting ×1
cmd ×1
const ×1
dropshadow ×1
for-loop ×1
latex ×1
performance ×1
resources ×1
shared-ptr ×1
struct ×1
transparency ×1
unicode ×1
vector ×1
wpf ×1