我正在尝试调用此方法
#define SIZE 16
void DoSomething(char(&value)[SIZE])
{
}
通过这种方法:
void BeforeDoingSomething(char* value, int len)
{
if (len == SIZE)
{
DoSomething(value);
}
}
尝试这样做会给我这个错误:
“ char(&)[16]”类型的引用(非const限定)不能使用“ char *”类型的值初始化
关于如何使编译器接受在函数value
中传递的BeforeDoingSomething
的提示?
答案 0 :(得分:6)
如错误所述,您不能使用指针初始化对数组的引用。
并且仅当您可以证明value
实际上指向适当类型的数组(的第一个元素)时,您可以做的是显式重新解释指针,并将其间接化:
DoSomething(*std::launder(reinterpret_cast<char(*)[SIZE]>(value)));
答案 1 :(得分:3)
您可以这样做,但前提是char[16]
指向的地址处有value
:
DoSomething(*std::launder(reinterpret_cast<char (*)[16]>(value)));
与第一个示例here相同。
答案 2 :(得分:3)
如果您确定值确实指向其答案中提到的正确大小的数组,则@ user2079303建议使用std::launder
是一个不错的选择。
另一种方法:由于在这种情况下SIZE
很小,因此创建value
的临时副本并将其传递给DoSomething()
可能更安全/更简单。但这完全取决于DoSomething()
的实际操作(例如,它是否修改传递给它的数组)。例如:
#include <iostream>
#include <vector>
#include <string>
constexpr int SIZE = 16 ;
void DoSomething(char (&value)[SIZE])
{
std::cout << "Do it!" << std::endl ;
}
void BeforeDoingSomething(char* value, int len)
{
if (len == SIZE)
{
char tmp_array[SIZE] ;
std::copy(value, value + len, tmp_array) ;
DoSomething(tmp_array);
} else {
std::cout << "Length: " << len << std::endl ;
}
}
int main()
{
std::string foo (SIZE, '-') ;
BeforeDoingSomething(foo.data(), foo.size()) ;
std::vector<char> bar (SIZE) ;
BeforeDoingSomething(bar.data(), bar.size()) ;
std::string qux ;
BeforeDoingSomething(qux.data(), qux.size()) ;
return 0 ;
}
here在线试用。