Сообщение Время жизни временного std::array от 05.07.2019 11:11
Изменено 05.07.2019 11:15 Muxa
Время жизни временного std::array
Есть объекты
, указатели на них
и функция принимающая массив указателей
Чего хотелось бы:
одной строкой вызвать функцию func не объявляя дополнительных переменных, передав в нее массив из этих указателей
Зачем:
1. код генерится автоматически — генерить одну строку немного проще
2. дополнительно объявленные переменные будут жить до выхода из скоупа, чего хочется избежать, так как такого кода может нагенериться очень много — да, можно ограничить время жизни дополнительных переменных фигурными скобками, но это опять же усложнит генератор и его использование
Лучшее что я придумал это:
Корректен ли данный вызов?
Не будет ли объект std::array удален до входа в func?
Спасибо.
typedef struct object
{
object() { std::cout << "ctor " << this << std::endl; }
~object() { std::cout << "dtor " << this << std::endl; }
} *object_ptr;
object object0;
object object1;
, указатели на них
object_ptr pointer0 = &object0;
object_ptr pointer1 = &object1;
и функция принимающая массив указателей
void func(object_ptr *pointers, size_t n);
Чего хотелось бы:
одной строкой вызвать функцию func не объявляя дополнительных переменных, передав в нее массив из этих указателей
Зачем:
1. код генерится автоматически — генерить одну строку немного проще
2. дополнительно объявленные переменные будут жить до выхода из скоупа, чего хочется избежать, так как такого кода может нагенериться очень много — да, можно ограничить время жизни дополнительных переменных фигурными скобками, но это опять же усложнит генератор и его использование
Лучшее что я придумал это:
func(std::array<object_ptr, 2>{ pointer0, pointer1, }.data(), 2);
Корректен ли данный вызов?
Не будет ли объект std::array удален до входа в func?
Спасибо.
код целиком | |
https://gcc.godbolt.org/z/ZDuCqS
| |
Время жизни временного std::array
Есть объекты
, указатели на них
и функция принимающая массив указателей
Чего хотелось бы:
одной строкой вызвать функцию func не объявляя дополнительных переменных, передав в нее массив из этих указателей
Зачем:
1. код генерится автоматически — генерить одну строку немного проще
2. дополнительно объявленные переменные будут жить до выхода из скоупа, чего хочется избежать, так как такого кода может нагенериться очень много — да, можно ограничить время жизни дополнительных переменных фигурными скобками, но это опять же усложнит генератор и его использование
Лучшее что я придумал это:
Корректен ли данный вызов?
Не будет ли объект std::array удален до входа в func?
с++17
компиляторы msvc, gcc, clang
OS win, lin, mac
Спасибо.
typedef struct object
{
object() { std::cout << "ctor " << this << std::endl; }
~object() { std::cout << "dtor " << this << std::endl; }
} *object_ptr;
object object0;
object object1;
, указатели на них
object_ptr pointer0 = &object0;
object_ptr pointer1 = &object1;
и функция принимающая массив указателей
void func(object_ptr *pointers, size_t n);
Чего хотелось бы:
одной строкой вызвать функцию func не объявляя дополнительных переменных, передав в нее массив из этих указателей
Зачем:
1. код генерится автоматически — генерить одну строку немного проще
2. дополнительно объявленные переменные будут жить до выхода из скоупа, чего хочется избежать, так как такого кода может нагенериться очень много — да, можно ограничить время жизни дополнительных переменных фигурными скобками, но это опять же усложнит генератор и его использование
Лучшее что я придумал это:
func(std::array<object_ptr, 2>{ pointer0, pointer1, }.data(), 2);
Корректен ли данный вызов?
Не будет ли объект std::array удален до входа в func?
с++17
компиляторы msvc, gcc, clang
OS win, lin, mac
Спасибо.
код целиком | |
https://gcc.godbolt.org/z/ZDuCqS
| |