c++ - 从已传递给函数的数组中复制
问题描述
int getWinnableTwo(char thisArray[9]) {
char oneArray[9];
std::copy(std::begin(thisArray), std::end(thisArray), std::begin(oneArray));
由于某种原因,这不会编译,而使用全局数组则可以。我想这是因为数组是通过引用传递的,但是我该怎么做才能使它工作呢?
错误:
不匹配的类型 'const std::valarray<_Tp>' 和 'char*'</p>
解决方案
当您将数组作为参数传递给函数时,它会衰减为原始指针。如果您将不同大小的数组传递给您的函数,您会看到这一点,您可能会对它编译感到惊讶:
char test[1];
getWinnableTwo(test);
你甚至不需要传递一个数组:
char test;
getWinnableTwo(&test);
你的功能相当于:
int getWinnableTwo(char* thisArray) {
char oneArray[9];
std::copy(std::begin(thisArray), std::end(thisArray), std::begin(oneArray));
return 0;
}
您不能在原始指针上调用std::begin
和std::end
,因为编译器无法知道指针指向的数据的大小。
一种解决方案是通过引用传递数组:
int getWinnableTwo(char(&thisArray)[9]) {
char oneArray[9];
std::copy(std::begin(thisArray), std::end(thisArray), std::begin(oneArray));
return 0;
}
这有一个额外的好处,你现在只能通过char [9]
而不是任何其他类型。
更多的 c++ 解决方案是使用std::array
它,您可以选择通过引用或值传递,并且不会衰减到指针:
int getWinnableTwo(std::array<char, 9>& thisArray) {
std::array<char, 9> oneArray;
std::copy(std::begin(thisArray), std::end(thisArray), std::begin(oneArray));
return 0;
}
推荐阅读
- python - 如何将autoitlibray导入ride?
- javascript - 如何使徽标居中并使菜单居中?
- android - 您如何查看 Android Studio 中某个类的方法?
- rx-java2 - 如何防止“onComplete”上的 Rxjava 主题?
- dynamics-crm - 无效的 Uri:Uri 方案太长。UriFormatException" 在动态-CRM FetchXML
- java - 如何根据 DataProvider 提供的测试参数修改 TestNG/Allure(@Test(description)、@Description、@TmsLink)值
- javascript - 在 POST 请求 302 重定向上设置 Cookie 头?
- python - 在 runHeartBreathRateKraskov.py 代码中出现错误 IndentationError:意外缩进?
- javascript - 反应路由器有条件路由或打开模式
- intellij-idea - 注入的资源类型 ManagedScheduledExecutorService 无效