草庐IT

C++ 语法 : default and delete modifiers

今天我偶然发现了这样一个代码片段:classA{A()=default;A(constA&)=delete;...}我从未见过delete或default关键字。它们是C++11标准的一部分吗?它们的用途是什么? 最佳答案 现在可以默认或删除特殊成员函数。已删除的成员函数仍然参与重载决议,但如果它被选中,则程序格式错误并且编译停止并提供有用的诊断。这是编写不可复制类之类内容的正确方法,并且用户会收到正确的错误消息。默认成员函数“做它应该做的”,例如默认的默认构造函数默认初始化所有基类和成员,并且主体为空;默认复制构造函数复制每个基对

c++ - 什么时候 'identifier' 在 C++ 中是 'name'?

C++中的“标识符”何时称为“名称”?我主要读到术语“名称”被过度使用,而不是示例中的“标识符”:structS{inti};Sthing1;在这种情况下,thing1是名称还是标识符?还是术语“标识符”和“名称”是类似的?在C中,在引用对象时是否使用术语“名称”? 最佳答案 在C++中,标识符只是一个数字、字母和_的序列。,不以数字开头。这样的标识符可以出现在任何地方,并且不必标识任何东西,尽管它的名字(没有双关语意)。术语名称将含义与特定语法结构相关联。C++规范规定,如果以下语法结构之一表示实体(对象、类、模板和依此类推)或标

c++ - 在 C/C++ 中,如何声明指向返回指向 int 值数组指针的函数的指针?

这是正确的吗?int(*(*ptr)())[];我知道这是微不足道的,但我正在查看有关此类构造的旧测试,而这种特定组合并未在测试中,这真的让我发疯;我只需要确定一下。这些声明是否有明确且可靠的可理解规则?(即:指向...数组的指针...指向...函数的指针......等等)谢谢!R 最佳答案 Theright-leftrule让它变得简单。int(*(*ptr)())[];可以理解为从变量名开始------------------------------ptr除了)什么都不对所以向左走找到*--------------是一个指针跳出

可变类型列表前缀的 c++ std::tuple

我试图从一些可变类型列表中提取类型前缀。这是我的尝试:#include#includetemplatestructpack{};templatestructprefix_tuple;templatestructprefix_tuple,Tnext,Ts...>{usingtype=typenameprefix_tuple,Ts...>::type;};templatestructprefix_tuple,Ts...>{usingtype=std::tuple;};templateusingprefix_tuple_t=typenameprefix_tuple,Args...>::typ

c++ - 如何强制 pow(float, int) 返回 float

重载函数floatpow(floatbase,intiexp)在C++11中被移除,现在pow返回一个double。在我的程序中,我正在计算很多这些(单精度),我对最有效的方法很感兴趣。是否有一些具有上述签名的特殊函数(在标准库或任何其他函数中)?如果不是,在任何其他操作(这将转换所有其他内容)之前将pow的结果显式转换为float是否更好(就单精度性能而言)转换成double)或者将iexp转换成float并使用重载函数floatpow(floatbase,floatexp)?编辑:为什么我需要float而不使用double?主要原因是RAM——我需要数十或数百GB,因此这种减少是巨

c++ - 奇怪的默认构造函数语法

在一些遗留代码中看到以下内容:classA{&A(){...}}“&”有什么用?它在VC++2008中编译,看起来像默认构造函数,错误gcc无法编译它。 最佳答案 尽管语法上&在语法的这个位置是允许的(它是一个declarator的例子,它是序列:ptr-operatordeclarator,&是一个ptr-operator),在语义上它没有意义并且在这里是不允许的。纯粹从语法角度来看它是有效的,这一事实可能表明了VisualStudio可能接受它的原因。检查可能性,这个声明看起来像一个没有返回类型的函数定义。7[dcl.dcl]/

c++ - noexcept 究竟包含什么构造函数?

根据C++标准,类构造函数上的noexceptnoexcept-specification究竟适用于什么?函数体?在可选的ctor-initializer中初始化成员?在可选的mem-initializer中初始化基类?在可选的mem-initializer中初始化类成员?复合语句?函数尝试block?未在ctor-initializer中初始化对象基类的初始化?未在ctor-initializer中初始化对象类成员的初始化?还有什么吗?换句话说,noexceptnoexcept-specification包含以上哪些内容(即触发std::terminate()时如果noexcept(

c++ - 没有 RTLD_GLOBAL 的类型信息、共享库和 dlopen()

当使用dlopen加载共享库时,我遇到了一些异常无法正常运行的问题(或者至少,正如我所希望的那样;我知道这有问题)。我在这里包含了一些简化的示例代码。实际情况是myapp=Matlab,myext1=mexglxmatlabextension,mylib是我代码在两个扩展之间的共享库(myext1,myext2)mylib.hstructFoo{Foo(inta);m_a;}voidthrowFoo();mylib.cpp#include"mylib.h"Foo::Foo(inta):m_a(a){}voidthrowFoo(){throwFoo(123);}myext1.cpp#in

c++ - 如何计算 32 位 float epsilon?

GameEngineArchitecture一书中:“...,假设我们使用一个浮点变量来跟踪以秒为单位的绝对游戏时间。在我们的规模达到之前我们可以运行游戏多长时间时钟变量变得如此之大,以致于向它添加1/30秒不再改变它的值?答案大约是12.9天。”为什么是12.9天,如何计算? 最佳答案 当无法精确表示浮点计算的结果时,会将其四舍五入为最接近的值。所以你想找到最小值x使得增量f=1/30小于h之间的宽度的一半x和下一个最大的float,这意味着x+f将舍入到x。因为同一binade中的所有元素的间隙都相同,我们知道x一定是它的二进制

c++ - C++1 7's deduced ` auto` 非类型 `template` 参数是否可以使用显式非类型参数模式匹配模板?

考虑这个例子(alsoavailableonwandbox):templateclass>voidtest(){}templatestructX{};正在尝试实例化test()在clang++4.0(trunk)导致编译错误:error:nomatchingfunctionforcallto'test'test();^~~~~~~note:candidatetemplateignored:invalidexplicitly-specifiedargumentfor1sttemplateparametervoidtest(){}我最初的假设/直觉是test可用于匹配任何template具