Время жизни временного std::array
От: Muxa  
Дата: 05.07.19 11:11
Оценка:
Есть объекты
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

#include <stdlib.h>
#include <iostream>
#include <array>

typedef struct object
{
    object() { std::cout << "ctor " << this << std::endl; }
    ~object() { std::cout << "dtor " << this << std::endl; }
} *object_ptr;

object object0;
object object1;

void func(object_ptr *pointers, size_t n)
{
    for (size_t i = 0; i < n; ++i)
        std::cout << "func " << pointers[i] << std::endl;
}

int main()
{
    object_ptr pointer0 = &object0;
    object_ptr pointer1 = &object1;

    func(std::array<object_ptr, 2>{ pointer0, pointer1, }.data(), 2);
    
    return 0;
}
https://thiscatdoesnotexist.com/
Отредактировано 05.07.2019 11:15 Muxa . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.