當用gcc 4.7.2或4.8.1編譯和運行下面的程序複製構造呼籲捕獲變量,而不是移動構造函數
#include <stdio.h>
#include <functional>
class A
{
public:
A()
{
}
A(const A& a)
{
printf("Copy ctor\n");
}
A(A&& a)
{
printf("Move ctor\n");
}
};
int main()
{
A a;
auto func = [a] {
};
auto newfunc = std::move(func);
return 0;
}
會給輸出:
Copy ctor
Move ctor
這似乎完全正常。
然而,當A a;
更改爲const A a;
,輸出如下:
Copy ctor
Copy ctor
爲什麼拉姆達的舉動受到了事實上的原始變量是否已經const或不?
FWIW,MSVC2012總是製作兩份。
constness不能自動刪除。通過添加它,捕獲lambda必須將其存儲爲const,並且不能從const移動。 –
@FrançoisMoisan這是接近但不完全正確,正如你可以從我的例子看到的,你可以用'const A &&' – aaronman
@aaronman重載移動構造函數你當然是對的。我以某種方式認爲簽名要求非const const rvalue引用specfically。 –