Как можно передать в функцию каст на 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;
}
Здравствуйте, 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) ...
Здравствуйте, 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>
|
| |
Она всё равно не используется. val не меняется.
Здравствуйте, 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 ссылки.