2013-03-26 159 views
1
struct Foo 
{ 
    char data[100]; 

    template<int T> 
    Foo(char (&&var)[T]) 
    { 
     data = std::move(var); 
     var = 0; 
    } 
}; 

int main() 
{ 
    char v[100]; 
    //..init v 
    Foo f(std::move(v)); //error C2664: 'Foo::Foo<100>(char (&&)[100])' : cannot convert parameter 1 from 'char [100]' to 'char (&&)[100]' 
    return 0; 
} 

我不明白爲什麼MSVC對行Foo f(std::move(v))不滿意? (也許這個代碼是無意義的)移動構造函數和字符數組參數

+1

你究竟如何移動一個數組?您可以將一個數組的元素移動到另一個數組,而不是數組本身。 – Praetorian 2013-03-26 16:26:15

+0

它只是用於教育目的 – Guillaume07 2013-03-26 16:34:45

+0

我認爲編譯器抱怨說它不能創建一個數組的右值引用。這只是一個猜測來自「&& C++ 11」,因爲我幾乎不瞭解C++ 11。 – 2013-03-26 16:40:26

回答

2

你可以使用std::move算法,從<algorithm>頭。

auto it = std::move(data, data + T, var); 

檢查T後不大於100,但移動char不超過只複製有很多好處。

2

Foo f(std::move(v)); 

是合法的GCC,鏘和英特爾。但Visual Studio抱怨和收益

error C2664: 'Foo::Foo(const Foo &)' : cannot convert parameter 2 from 'char [100]' to 'char (&&)[100]' 
1>   You cannot bind an lvalue to an rvalue reference 

這對我來說似乎是一個錯誤。實際上,v是一個左值,但std::move將其轉換爲右值引用。

由於字符數組是不可移動的,儘管合法,但我並沒有看到用右值引用來獲取它們的很多用法。如果您確實想要編譯代碼,則解決方法是讓f接受常規(左值)引用,並在呼叫站點刪除std::move。或者甚至更好,使f指向char*f不需要是模板)。在這種情況下,調用f(v)將地址v[0](即v的第一個元素)傳遞給f。這就是所謂的陣列到指針的轉換,它由編譯器隱式執行。

然而,正如其他人所指出的那樣,線

data = std::move(var); 
    var = 0; 

是所有的編譯器是非法的。 datavar是數組(或對數組的引用)和數組不可分配。例如,每個編譯器var = 0;引發的錯誤如下:

GCC:

error: incompatible types in assignment of 'int' to 'char [100]' 

鏘:

error: array type 'char [100]' is not assignable 

英特爾:

error: expression must be a modifiable lvalue 

的Visual Studio:

error C2440: '=' : cannot convert from 'int' to 'char [100]' 
+0

當谷歌搜索同一個問題時發現這個答案。我不清楚,但在閱讀後,在這樣的一個類中,對於移動構造函數有什麼作用?我們完全刪除它嗎?我仍然實現它,但strcpy在移動構造函數中的char數組?你已經介紹了一個解釋,但並沒有真正涵蓋要做什麼。 – 2017-11-27 22:10:43

+1

@ChristopherPisz其實,我不會添加這個移動構造函數。 (請參閱OP中的[評論](https://stackoverflow.com/questions/15641776/move-constructor-and-char-array-argument/15646200?noredirect=1#comment22194276_15641776))作者說這個問題是爲[「教育目的」](https://stackoverflow.com/questions/15641776/move-constructor-and-char-array-argument/15646200?noredirect=1#comment22194636_15641776),這讓我把這個問題解釋爲「爲什麼編譯器在抱怨?「而不是「這種構造函數是什麼是明智的實現?」。 – 2017-11-28 18:16:46