小编JDł*_*osz的帖子

在C++中将参数传递给lambda

我似乎错过了C++中lambda机制的一些观点.这是代码:

std::vector<int> vec (5);

int init = 0;
std::generate(begin(vec), end(vec), [init]() mutable { return ++init; });

for (auto item : vec) {
    std::cout << item << " ";
}
std::cout << std::endl << init << std::endl;
Run Code Online (Sandbox Code Playgroud)

如果没有mutable它就不会编译,因为我正在改变initlambda.
现在,我的理解拉姆达被每一个信息载体的一个项目新的全新副本init是0,所以,1必须每次都返回.但这段代码的输出是:
1 2 3 4 5
0

它看起来像在执行开始时generate复制init 一次.但为什么?它应该像这样工作吗?

c++ parameters lambda mutable

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

如何在VS2015中构建OpenSSL:x86cpuid.asm是一个空文件

我需要为一个使用32位VS2015的项目构建OpenSSL.

我发现的说明是http://developer.covenanteyes.com/building-openssl-for-visual-studio/以及据报道在http://blog.box.kr/?p=953上使用VS2015的更新/编辑版本.

在我解压缩发行版的目录中,我首先cl确认我有一个MS Compiler构建提示(由他们的批处理文件设置),并perl -v确保我有Perl.然后,

perl Configure VC-WIN32   no-idea no-mdc2 no-rc5  --prefix=e:\some\path
ms\do_ms
nmake -f ms\nt.mak
Run Code Online (Sandbox Code Playgroud)

在最后一步,我得到:

Building OpenSSL
    perl .\util\copy-if-different.pl ".\crypto\buildinf.h" "tmp32\buildinf.h"
Copying: ./crypto/buildinf.h to tmp32/buildinf.h
    perl .\util\copy-if-different.pl ".\crypto\opensslconf.h" "inc32\openssl\opensslconf.h"
Copying: ./crypto/opensslconf.h to inc32/openssl/opensslconf.h
    ml /nologo /Cp /coff /c /Cx /Zi /Fotmp32\x86cpuid.obj tmp32\x86cpuid.asm
Assembling: tmp32\x86cpuid.asm
tmp32\x86cpuid.asm(1) : error A2088:END directive required at end of file
NMAKE : fatal error U1077: '"D:\@Prog-Charon\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\ml.EXE"' : return code '0x1'
Stop. …
Run Code Online (Sandbox Code Playgroud)

openssl visual-studio-2015

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

`constexpr`函数也应该是'noexcept`吗?

当我定义一个constexpr函数时,我是否也应该声明它noexcept?我想在参数和用法满足编译时评估要求的情况下,潜在异常的含义没有实际意义.但是对于在运行时评估函数的情况,它将正常应用.

作为一个实际问题,如果函数确实很简单,可能使用内置算术或强制转换,这样我希望编译器可以始终内联函数并在其中进行优化,这对生成代码的效率是否重要如果我离开noexcept

c++ c++11

8
推荐指数
1
解决办法
237
查看次数

win32 CreateFile2 api调用的目的是什么?

他们在Windows 8中添加了一个新的API调用,CreateFile2 据我所知,它与现有CreateFile函数完全相同,只是它的参数打包方式有些不同.

已经添加了什么来实现这一点,因为我在文档中看不到任何内容.

winapi windows-8

7
推荐指数
2
解决办法
2954
查看次数

为 vscode 调试器的 C++ 类型创建“可视化工具”

在指令(https://code.visualstudio.com/docs/cpp/launch-json-reference)中,我看到VSCode可以使用“.natvis”文件。然后它引用 Visual Studio 中的文档,因此大多数使用信息不适用,但有一个关于文件语法的相当简短的部分。

  • 它说“Natvis 自定义适用于类和结构,但不适用于 typedef”。但是类型别名的情况如何呢using?“变量”窗格中向我显示的类型确实涉及using创建代码随后使用的名称,尽管它实际上是在内部命名空间和模板别名中定义的。我需要解开没有任何usings 的名称吗?

  • 它提供了一个简单的模板示例,但该示例使用类型参数并且仅使用一个模板参数。那么非类型参数呢?是对*要匹配的名称字符串进行操作还是仅对名称的各个部分进行操作?

    template <int S, int F>
    class Decimal { ... };
    
    Run Code Online (Sandbox Code Playgroud)
  • 有关在 Visual Studio 2019(在 Windows 上!)中打开诊断的信息与 VSCode 完全无关。我该如何排除故障?

  • 如上所述,我有一个Decimal用整数表示定点数的类。当函数无法调用时,如何制作我想要的输出?字符串操作可以工作,一旦整数成员(字段)形成字符串用于显示,我只需要在右边的位置插入一个F小数点

c++ vscode-debugger

7
推荐指数
0
解决办法
618
查看次数

Visual C++不断破坏我的代码格式对齐

我正在开发一个在源代码中使用水平对齐的开源项目.代码是用C++编写的,我使用的是Visual Studio 2013.Visual Studio尝试在间距方面很聪明,但最终会破坏我的手动对齐.

典型的代码如下所示:

bool  ?   ?   ? GetFieldWithType  ?   ? ( int idx, cc8* name, int type );
bool  ?   ?   ? GetFieldWithType  ?   ? ( int idx, int key, int type );
static cc8*   ? GetLuaTypeName    ?   ? ( int type );
void* ?   ?   ? GetPtrUserData    ?   ? ( int idx );
Run Code Online (Sandbox Code Playgroud)

现在,如果我像这样添加另一行,只要我输入左括号(在两个选项卡之后),Visual Studio就会删除我刚刚输入的两个选项卡并用一个空格替换它们.我试着耐心点击Ctrl + Z来撤消自动格式化.但是一旦我输入分号,它就会再次杀死标签.

我在工具>选项>文本编辑器> C/C++>格式设置>间距>间距中找到了一个选项,用于切换是否在参数列表的左括号之前插入空格的函数括号.如果我取消激活此选项,VS仍然坚持在左括号之前删除选项卡,它只是不添加空格.我如何摆脱这种行为?

要明确:我很好用VS自动插入空格(根据我的配置).我不想完全停用自动格式化.我只是不希望它删除我手动输入的间距.

code-formatting autoformatting visual-studio visual-c++ visual-studio-2013

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

基于范围的锁保护和返回值的时间

class C {
    mutable std::mutex _lock;
    map<string,string> deep_member;
public:
    auto get_big_lump()
     {
     std::unique_lock<std::mutex> lock(_lock); // establish scope guard
     return deep_member;  // copy the stuff while it can't be changed on another thread.
     }
};
Run Code Online (Sandbox Code Playgroud)

关于保护和返回值复制的保证时间是什么? 如果允许(或实际!)优化,复制将在持有锁的同时进行,还是可以在函数体返回后完成?

c++ scope rvo

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

VS2015 错误列表项全部翻倍

在 VS2015 中,如果重要的话,我正在使用本机 C++,错误列表中的所有警告都加倍了。我知道标题将被多次包含,但我可以看到 .cpp 文件的一个项目以相同的行号和相同的内容列出了两次。

我已经禁用了所有可能的扩展,并且过滤器选项设置为“仅构建”(不显示 Intellisence 错误)。(我在网络搜索中发现的唯一一件事是针对不同类型的项目,其中不同的工具都发现了错误)

我不知道还能去哪里寻找导致它的原因。

在此处输入图片说明

我已经编辑了项目名称和文件名,但是这对中的每个项目在这些字段中也是相同的。最下面的一对来自 Qt*.ui代码生成器,而不是 CL 任务。这告诉我这不是导致此问题的单个任务,而是关于整个错误列表的一些信息。

它们在“输出”窗口中不会加倍。即使在加载项目和构建之后也会发生这种情况,因此错误列表内存中没有任何来自先前编译的剩余内容。

visual-studio-2015

5
推荐指数
2
解决办法
732
查看次数

偶数单次计算中的`float` vs`double`?

我看到有些人编写代码,其中声明需要浮点的东西的临时使用使用float类型(在C/C++中).这不是一个巨大的矩阵,空间很重要,或者试图更多地融入SIMD,或类似的东西.一些小事情,比如按百分比缩放值,或找到数量之间的比率.

我总是习惯double并且float只考虑空间真正重要的时候.我记得台式机CPU没有浮点硬件的日子,可能会有一些关于软件库性能的说法,但是对于第一个'287协处理器,本机精度仍然是80位,而且float只是为了长期在RAM或文件中存储值,并且不会影响计算速度.

今天,有没有理由使用float而不是double习惯性的方式? 情况1:特定于PC/Mac硬件; 情况2:便携式代码,可能在台式机和移动设备上,如电话.

我应该以我记忆的方式教育我的团队:嘿,你知道,这float是一个半尺寸的东西,double是正常的.或者是否存在一些折衷或者为什么C++程序员会float在任何地方使用它,而且看起来(对我的POV)不知道double存在的是什么?

我的问题并不是特定于语言,但我的术语float是4个字节,double是8个字节.

floating-point

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

CSS 居中:margin-left 和 -right auto,但结果很有趣

您可以在http://led.dlugosz.com/查看该页面。\xe2\x80\xbb 我想让“图库”部分在可用空间中居中,而不是向左齐平。

\n\n

所以,我添加了规则

\n\n
margin-left: auto;\nmargin-right: auto;\n
Run Code Online (Sandbox Code Playgroud)\n\n

似乎工作得恰到好处。但是,当我在另一个页面上做同样的事情时,它根本不起作用,而且我找不到任何区别。然后,再仔细研究一下这个页面,我发现在不同的窗口宽度下它可以工作,不能工作,或者做一些非常奇怪的事情。这里发生了什么?更重要的是,我怎样才能实现这个效果呢?

\n\n
\n\n

\xe2\x80\xbb 我更新了页面并最终将其删除。

\n

css centering

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

复制初始化与直接初始化发生了变化吗?

我很久以前就了解到,复制初始化会创建一个临时对象,然后用于初始化目标,尽管后者的复制构造函数已被优化掉;但编译器仍然假装使用它,检查是否存在并允许访问。

\n\n

我注意到 Herb Sutter 在更新的 GOTW 帖子中提到,auto使用时这不再是正确的。

\n\n

具体来说,Herb(2013 年撰写)仍然阐述了一般熟悉的规则:

\n\n
\n

如果x是其他类型,从概念上讲,编译器首先将 x 隐式转换为临时小部件对象\xe2\x80\xa6 请注意,我在上面多次提到过 \xe2\x80\x9c 概念上\xe2\x80\x9d。\xe2\x80\x99s 因为实际上编译器被允许并且通常会优化来自GOTW #1 的临时 \xe2\x80\x94

\n
\n\n

他后来指出,当auto使用时(在 中auto w = x;),仅调用一个复制构造函数,因为没有x需要首先转换的方法。

\n\n

如果函数返回迭代器(因此 it\xe2\x80\x99 是一个右值):

\n\n
\n

毕竟,正如我们在 GotW #1 中看到的,通常额外=意味着两步 \xe2\x80\x9c 转换为临时的然后复制/移动 \xe2\x80\x9d 的复制初始化 \xe2\x80\x94 但请记住auto像这样使用时,\xe2\x80\x99t 不适用。\xe2\x80\xa6 急!不需要任何转换,我们直接构造i. \xe2\x80\x94 GOTW #2(强调我的)

\n
\n\n

如果从函数返回的类型与通过复制初始化初始化的变量的类型完全相同,则规则是临时变量被优化,但它仍然检查复制构造函数的访问。Herb 表示, 的情况并非如此auto,而是使用了直接初始化。

\n\n …

c++ initialization

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

std :: array作为另一个标准容器的元素类型?

似乎没有任何反对它的规则,以及我得到的错误

std::vector< std::array<int,8> > output;
output.resize (8);
Run Code Online (Sandbox Code Playgroud)

C2036 'std::array<int,0x08> *': unknown size

这没有意义.内部的代码<vector>是推进内部end指针,也在其他地方使用(也就是扩展的计算大小).a的大小struct{int x[8];}肯定是"已知的".

这里发生了什么?


嗯,因为它不仅仅是一个简单的拼写错误或者某些东西,并且在其他人尝试它时似乎工作正常(并且其他人写的样本为我工作!)我减少了源文件,直到没有剩下任何东西,但是令人讨厌的陈述,它仍然失败.这是整个文件.预编译的标头已关闭.

//#include <SDKDDKVer.h>

#include <vector>

int main()
{

    std::vector< std::array<int,8> > output;
    output.resize (16);

}
Run Code Online (Sandbox Code Playgroud)

我正在使用x64构建,发布版本.


弄清楚了:

这不是一个缺少的#include vector,但是对于array!它显然是在其他标题中向前声明但是不完整.

c++ stl visual-c++-2015

-6
推荐指数
1
解决办法
147
查看次数