将char指针传递给接受对char数组的引用的函数

时间:2018-09-28 17:43:07

标签: c++

我正在尝试调用此方法

#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的提示?

3 个答案:

答案 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在线试用。