我想(为了好奇)为什么在C++中不允许运算符重载指针.我的意思是这样的:
Vector2d* operator+(Vector2d* a, Vector2d* b) { return new Vector2d(a.x + b.x, a.y + b.y); }
Vector2d* a = new Vector2d(1, 1);
Vector2d* b = new Vector2d(2, 2);
Vector2d* c = a + b;
Run Code Online (Sandbox Code Playgroud)
注意'a + b'如何创建一个新的Vector对象,然后只将其地址复制到'c',而不调用复制构造函数.因此,它将解决新的右值引用解决的相同问题.另外,据我所知,它几乎等同于在C#中使用运算符重载时发生的事情(但我可能在这里错了,我从未真正使用过C#),以及为什么在C#中不需要rvalue refs.
是的,rvalue参考解决方案甚至更好,因为它允许基于堆栈的对象,而这种重载会强制所有Vector2d对象都存在于堆上,但是,它似乎很容易在编译器中实现,可能在rvalue refs到来之前的几年.使用自定义分配器,它甚至不会那么慢.
因此,这只是非法的,因为"最不意外"的原则,还是有其他原因?
如何使用boost :: bind或boost :: lambda绑定转换为bool的运算符?
例如,假设我有一个C类,一个运算符bool()和一个list<C>.如何使用remove_if和bind/lambda删除转换为bool时评估为false的所有元素?
为什么print("2")在下面的代码中永远不会调用该部分?我认为内部main.async会将块推入主循环的队列中,然后RunLoop.run执行它,但显然情况并非如此。(它打印1、run、run、run等)
另外,如果我删除外部块main.async,然后直接运行该块中的代码(仍在主队列上,在viewDidLoad新的单视图应用程序中),那么内部main.async块就会被执行(打印1,,run)2。为什么这一变化会产生如此大的差异?
var x = -1
DispatchQueue.main.async { // comment out this line for question #2
print("1")
x = 1
DispatchQueue.main.async {
print("2")
x = 2
}
while x == 1 {
print("run")
RunLoop.main.run(mode: .default, before: Date() + 1)
}
} // comment out this line for question #2
Run Code Online (Sandbox Code Playgroud) 考虑以下代码:
#define N_ 0
#define N_X 1
#define M(a) N_
M(arg)X; // #1 -- I'd like this to expand to N_X, and ultimately 1; but it's 0X instead
M(arg); // #2 -- this should and does expand to 0
Run Code Online (Sandbox Code Playgroud)
#1的问题在于,在扩展M()之后,结果包含N_,并且在将其与X连接之前,预处理器找到并展开它.我可以以某种方式延迟重新扫描结果以进一步扫描宏,以便预处理器找到N_X而不是N_?