我找到了这样的代码:
template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) {
return a+b;
}
Run Code Online (Sandbox Code Playgroud)
我想到了所有细节,这对我来说是新的,但只有一个.请告诉我,在哪里可以阅读,箭头操作符(->
)在函数标题中的含义是什么?我纯粹从逻辑上说,那个->
算子确定了一个类型,auto
但是我希望得到这个,但找不到信息.
我为什么这样做:
int i = *(new int (5));
Run Code Online (Sandbox Code Playgroud)
并i
在之后成功使用,
但是当我在尝试时:
delete &i;
Run Code Online (Sandbox Code Playgroud)
我得到一个运行时错误:
Test.exe中0x5ddccaf7(msvcr100d.dll)的未处理异常:0xC00000FD:堆栈溢出.
如果i
是参考:
int & i = *(new int (5));
Run Code Online (Sandbox Code Playgroud)
,所有这些(包括delete
)工作正常.
我知道,将指定的内存处理程序保留在除指针之外的其他内容并不好*(new ...)
,但是我只是想知道,为什么new
工作正常但是delete
失败了.
//以下只是我猜测这种行为的原因:
是因为执行程序的模块(它可能不是"编译器",因为已经有运行时间)遇到它时delete
,它会搜索一些信息,如指向的数据长度&i
(在某些内部数组中有关所有指针的信息) )并没有找到它或解释一些垃圾数据作为这些信息?(我想,指针和引用都有它,但变量没有)
怎么了?
using T = int;
Run Code Online (Sandbox Code Playgroud)
?
它会导致编译器错误 CS 1001 Identifier expected
我正在尝试这样做:
const string intType = typeof(int).ToString();
switch (typeof(MyT).ToString())
{
case intType:
{
return "int";
break;
}
...
}
Run Code Online (Sandbox Code Playgroud)
但编译说:
错误CS0133:分配给'intType'的表达式必须是常量
据我所知,typeof
运算符在编译时工作.那么,怎么了?
我想声明一个2元素的向量作为类成员.但下一代码会生成错误:
class A {
private:
std::vector<int> v (2);
...
}
Run Code Online (Sandbox Code Playgroud)
编译器curses"2"是常量.据我所知,问题是,出现歧义,因为编译器将向量声明的字符串解析为函数声明(函数,以"2"作为参数并返回int的向量).
问题:我可以避免这种歧义吗?我怎样才能做到这一点?
PS:在类之外,这个向量声明被正确解析.
我正在尝试做类似的事情:
using std::array;
array< array<int, 3>*, 10> arrsPtrs;
void f()
{
arrsPtrs[0] = new array<int, 3> {1, 2, 3}; //bad!
arrsPtrs[0] = new array<int, 3> {{1, 2, 3}}; //bad!
arrsPtrs[0] = new array<int, 3> ( {1, 2, 3} ); //bad!
arrsPtrs[0] = new array<int, 3> ( {{1, 2, 3}} ); //bad!
}
Run Code Online (Sandbox Code Playgroud)
是否可以在这种表达式中聚合初始化STL容器?
PS:可能很重要 - 我有VS2010.
我的代码解决二次方程(在游戏逻辑滴答中)来解决任务 - 找到沿着空间中可移动物体轨道的卫星刻度线偏移.我在判别(更远D
)的计算中遇到了错误.我会提醒:D = b^2 - 4ac
.因为它是大对象的轨道,我a
,b
&c
是订单的数量,如:
1E+8
1E+12
1E+16
因此,b^2
是关于订单的数量1E+24
,4ac
也是约1E+24
.但是这个方程根数要少得多,因为它们只是场景上的坐标.所以根本就是1E+3 ... 1E+4
.
问题(更新-具体化):因为浮浮(双打)的值的b^2
和4ac
有误差,这是足够小(相对于这些非常大的数字[测得的绝对误差大约有秩序1E+18
]),但作为D
==的区别其中,所以当D
(从较大的值侧)到所述不准确度为(1E+18
)的顺序值时,其值在范围内开始波动+1E+18 .. -1E+18
(即波动范围大于实际的[-100%.. + 100%]值!
显然,这种波动会导致错误(甚至是错误的定向)嘀嗒声.我的卫星开始摇晃(这很糟糕)).
注意:当我说"何时D
接近零"实际上D
仍然远离零时,所以我不能只在这个值范围内将它分配给zerro.
我考虑过使用定点计算(这可以帮助我解决问题).但是,建议不要在刻度逻辑中使用(因为它们的优化程度要低得多,而且可能会非常慢).
我的问题:我怎样才能解决我的问题?对我的案子可能有一些常见的解决方案吗?非常感谢任何建议!
PS:所有公式都很好(我在excel中计算了所有结果,并且在我的代码中浮动时失败了).
PPS:我尝试双打insted的花车(不是所有的计算,但我的a
,b
和c
双打现在)的问题并没有消失.
更新:我犯了一个错误 - 命令的混乱顺序a
, …
quotient = 43156414f / 3;
Run Code Online (Sandbox Code Playgroud)
我在这里得到quotient
== 1438547 2(完全不是真正的价值应该是: 1438547 1,333...)。它完全失去了所有小数部分!
我知道浮点计算不准确(似乎不是全部,我应该知道),但是,正如我所告知的,错误可能出现在更远的有效数字上。但这里的红利只是 8 位数字。为什么会发生如此戏剧性的错误?
可选的子问题:我应该记住哪些规则来预见未来的此类错误?
请注意:将分红类型从 float 更改为 double 可以解决此问题。