草庐IT

C++标准

全部标签

c++ - 选择什么标准容器(如果有)?

我需要一些内存管理,希望我可以将其基于一些std容器。我的要求是:元素只有一个默认构造函数(没有复制,没有移动,没有别的)容器可以通过一小块连续的元素扩展(在后面)我什至可以粗略地知道我总共需要多少元素,甚至可以随时知道最终需要多少元素。不过,这些都是估计值。我真的不需要迭代器,但获取元素运行编号的方法会很方便。所以,我需要一些可以通过添加block来扩展的东西,比如std::deque.但是用std::deque,我不能保证扩展,比如说,8个元素,给我一个连续的block。和std::deque没有capacity所以我不能从std::deque中“适应”.这意味着我必须自己编写,对

c++ - 删除右值,保留左值引用(标准类型特征可用?)

我正在尝试编写一个函数,以std::tuple的形式返回可变参数包的子集。理想情况下,该函数应该没有运行时开销(没有不必要的拷贝),并且它应该允许用户访问lvalue引用并修改它们。应维护值类型、lvalue引用和constlvalue引用。临时对象(rvalue引用)应“转换”为值类型以避免创建无效引用(对临时对象的引用)。期望结果示例:intlr=5;constint&clr=lr;autot=make_subpack_tuple(lr,clr,5);static_assert(is_same>{},"");//Ok,modifieslr:std::get(t)=10;//Comp

c++ - 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>::c_str':非标准语法;使用 '&' 创建指向成员的指针

我正在尝试创建一个可以读取和编译opengl顶点和片段着色器文件的函数,但是我收到了这个错误:'std::basic_string,std::allocator>::c_str':non-standardsyntax;use'&'tocreateapointertomember我不太确定如何修复它。这是我的代码:GLuintshader_load(constGLchar*vertex,constGLchar*fragment){std::stringver=file_read_all(vertex);std::stringfrag=file_read_all(fragment);con

c++ - std::move 是否与左值引用一起使用? std::move 如何在标准容器上工作?

#includestructA{inta[100];};voidfoo(constA&a){std::vectorvA;vA.push_back(std::move(a));//howdoesmovereallyhappen?}intmain(){Aa;foo(a);}上面的代码编译正常。现在到处都写着move避免复制。以下是我的查询:move在处理左值时真的有效吗[非]-const引用?即使有“右值引用”,对象复制时如何避免复制像上面一样插入标准容器中?例如voidfoo(A&&a){//supposeweinvokethisversionstd::vectorvA;vA.push_

c++ - 大型嵌入式公司真的是 "forced"使用旧的编程标准/编译器吗?

关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭6年前。Improvethisquestion我们的讲师告诉我们,在完成作业时,我们只能使用C++98/C99标准,通过为编译器指定正确的标志,我们可以确保我们不会违反此规则。我知道这是为了让人们可以学习“真正的”C或C++,无论他们选择哪个,并在没有任何新语言功能帮助的情况下练习这种技能(我不同意,但我有什么资格争辩)。当问我的讲师为什么这条规则时,他回答(在知道我对上述答案不满意之后):“因为像ASML这样与嵌入式设备一起工作的大

c++ - 为什么 C++11 标准中的 INVOKE 工具引用数据成员?

标准的$20.8.2描述了INVOKE工具,该工具主要用于描述如何在整个标准库中使用可变参数列表调用可调用对象:DefineINVOKE(f,t1,t2,...,tN)asfollows:—(t1.*f)(t2,...,tN)whenfisapointertoamemberfunctionofaclassTandt1isanobjectoftypeTorareferencetoanobjectoftypeTorareferencetoanobjectofatypederivedfromT;—((*t1).*f)(t2,...,tN)whenfisapointertoamemberfun

c++ - 指针可以指向4GB之后的地址吗?

如果我们编译并执行下面的代码:int*p;printf("%d\n",(int)sizeof(p));似乎指向任何类型的指针的大小都是4个字节,这意味着32位,因此232个地址可以存储在一个指针中。由于每个地址都与1个字节相关联,因此232字节为4GB。那么,指针如何指向4GB内存之后的地址呢?一个程序如何使用超过4GB的内存? 最佳答案 原则上,如果你不能表示超过2^X-1的地址,那么你就不能寻址超过2^X字节的内存.即使已经实现和使用了一些变通办法(如PAE),这对于x86也是如此,即使这些变通办法比真正的问题解决方案更多的事实

c++ - 我怎样才能用 GNU g++ 只编译标准 C++?

GNUg++编译器中有一些扩展,例如VLA(可变长度数组),即使这些功能不是C++标准。因此,如果我需要仅使用C++标准构造来编译程序并避免那些额外的扩展,我可以使用GNUg++来完成吗?像g++test.cpp-std=onlyStandards这样的东西? 最佳答案 传递-pedantic-errors标志。请务必使用-std=设置标准,例如-std=c++14。这也适用于clang。 关于c++-我怎样才能用GNUg++只编译标准C++?,我们在StackOverflow上找到一个

c++ - std::function/bind 就像没有标准 C++ 库的类型删除

我正在基于发布/订阅模式使用C++11开发一个简单的事件驱动应用程序。类有一个或多个onWhateverEvent()事件循环调用的方法(控制反转)。由于应用程序实际上是一个固件,其中代码大小很关键,灵active不是高优先级,“订阅”部分是一个包含事件ID和相关处理程序的简单表格。这是一个非常简化的代码:#includeenumEvents{EV_TIMER_TICK,EV_BUTTON_PRESSED};structButton{voidonTick(intevent){/*publishEV_BUTTON_PRESSED*/}};structMenu{voidonButtonPr

c++ - lambdas 中的模板参数列表中的 auto 是标准的一部分吗?

今天,我偶然发现了以下代码片段:#includeintmain(){autoa=[](std::pairvalue){};a(std::pair{3,true});}http://cpp.sh/5p34我只有一个问题:标准支持这段代码吗?它在GCC中编译(使用-std=c++14),但不是clang或VisualStudio2015(VC++14)。这似乎应该成为标准的一部分,因为如果lambda应该具有与常规函数相同的模板支持,那么应该支持它。这似乎可以转换为所有模板类型,而不仅仅是std::pair。 最佳答案 在C++14中,