小编imr*_*mre的帖子

C++运算符重载指针

我想(为了好奇)为什么在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到来之前的几年.使用自定义分配器,它甚至不会那么慢.

因此,这只是非法的,因为"最不意外"的原则,还是有其他原因?

c++ operator-overloading rvalue-reference

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

C++ boost :: bind/lambda和operator bool()

如何使用boost :: bind或boost :: lambda绑定转换为bool的运算符?

例如,假设我有一个C类,一个运算符bool()和一个list<C>.如何使用remove_if和bind/lambda删除转换为bool时评估为false的所有元素?

c++ lambda boost bind

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

iOS RunLoop 和 DispatchQueue.main.async

为什么print("2")在下面的代码中永远不会调用该部分?我认为内部main.async会将块推入主循环的队列中,然后RunLoop.run执行它,但显然情况并非如此。(它打印1runrunrun等)

另外,如果我删除外部块main.async,然后直接运行该块中的代码(仍在主队列上,在viewDidLoad新的单视图应用程序中),那么内部main.async块就会被执行(打印1,,run2。为什么这一变化会产生如此大的差异?

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)

nsrunloop ios dispatch-queue

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

延迟宏扩张

考虑以下代码:

#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_?

c-preprocessor

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