void foo(const char* & val)
От: Lepsik Индия figvam.ca
Дата: 17.05.21 06:26
Оценка:
Как можно передать в функцию каст на tst без использования промежуточной переменной p?

void foo(const char* & val)
{
    char* r = new char[255];;

    strncpy_s(r, 255, val, 255);

    cout << r;
}

int main(int argc, char const *argv[])
{   
    char tst[255] =  "TEST";
    const char* p = &tst[0];

    foo( (const char* &)p);

    return 0;
}
Re: void foo(const char* & val)
От: ArtDenis Россия  
Дата: 17.05.21 06:33
Оценка:
Здравствуйте, Lepsik, Вы писали:

L>Как можно передать в функцию каст на tst без использования промежуточной переменной p?


void foo(const char (&val)[255])
{
    std::cout << val;
}

int main(int argc, char const *argv[])
{   
    char tst[255] =  "TEST";
    foo(tst);
    return 0;
}


или что-то другое имелось ввиду? PS: Возможно я не правильно понял вопрос и ТС устроит и
void foo(const char *val) ...
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: void foo(const char* & val)
От: B0FEE664  
Дата: 17.05.21 10:08
Оценка: 6 (1)
Здравствуйте, Lepsik, Вы писали:

L>Как можно передать в функцию каст на tst без использования промежуточной переменной p?


Вот эдак:
foo(const_cast<const char*&>(static_cast<const char* const &>(tst)));

, но лучше так не делать. Функция foo принимает аргументом НЕ константную ссылку на указатель на константную строку, т.е. неявно предполагается, что val — это "выходной" аргумент, который может быть изменён внутри функции foo.

  surprise
L>
L>void foo(const char* & val)
L>{
L>    char* r = new char[255];;

L>    strncpy_s(r, 255, val, 255);
      val = "surprise!";
L>    cout << r;
L>}

L>int main(int argc, char const *argv[])
L>{   
L>    char tst[255] =  "TEST";
L>    const char* p = &tst[0];

L>    foo(p);
      cout << p;
L>    return 0;
L>}
L>
И каждый день — без права на ошибку...
Re: Убрать ссылку?
От: johny5 Новая Зеландия
Дата: 18.05.21 07:30
Оценка: +1
Она всё равно не используется. val не меняется.
Re: void foo(const char* & val)
От: rg45 СССР  
Дата: 26.05.21 14:45
Оценка:
Здравствуйте, Lepsik, Вы писали:

L>Как можно передать в функцию каст на tst без использования промежуточной переменной p?


На правах вредного совета: добавить перегрузку foo для rvalue reference:

void foo(const char* & val)
{
    char* r = new char[255];;

    strncpy_s(r, 255, val, 255);

    cout << r;
}

void foo(const char* && val)
{
    foo(val);    
}

int main()
{   
    char tst[255] =  "TEST";

    foo(tst);
}

Отработает именно так, как ты хочешь

P.S. Создания промежуточного указателя не избежать, поскольку ссылку на указатель можно привязать только к указателю, никак не к массиву. Разница лишь в том, что в твоем примере такой указатель (p) создается явно как локальная переменная, а в моем — неявно, как временный объект с одновременным созданием rvalue ссылки, с последующим получением lvalue выражения и привязкой к нему lvalue ссылки.
--
Отредактировано 27.05.2021 6:04 rg45 . Предыдущая версия . Еще …
Отредактировано 27.05.2021 5:55 rg45 . Предыдущая версия .
Отредактировано 26.05.2021 15:04 rg45 . Предыдущая версия .
Отредактировано 26.05.2021 15:04 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.