2013-03-26 27 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