LINUX.ORG.RU

Почему нельзя оператор преобразования в массив?

 


0

3
template<int n>
struct S
{
    operator char[n]() const // fail!
    {
        return { 0 };
    }
};

Это просто пример, не нужно в нем искать глубинную применимость на практике. Но идея такая, что массив такой же тип, как и скаляр, и почему бы не позволить конвертить в него оператором?

★★★★★

Ну вообще-то можно, просто у S перегрузите operator[] как просто возвращайте string или std::vector и всё. С другой стороны прямое преобразование невозможно просто потому что в Си++ нет такого примитивного типа как «массив из char определённой длины» и лучшее что вы можете сделать, так это сделать(не считая первых двух вариантов) так char * operator[], но тут я думаю и объяснять не нужно то, на кого будет свалена ответственность за управление памятью - либо на вас, либо на умный указатель, либо на костыльную систему которая сама выбросит в деструкторе всю свою щедроту.

AKonia ★★
()
Последнее исправление: AKonia (всего исправлений: 1)

Ты же пытаешься вернуть голый массив.

thunar ★★★★★
()

Но идея такая, что массив такой же тип, как и скаляр

Вот в этом месте ты и продемонстрировал всю глубину.

LamerOk ★★★★★
()

Массивы, как и типы-функции не являются копируемыми. А так же массивам нужен сторедж, которого нету. Он может существовать лишь внутри того, что может дать память.

rafyibofye
()
Ответ на: комментарий от rafyibofye

Ну, строго говоря, статичные массивы внешнего стораджа не имеют, поэтому достаточно их «упаковать» в структуру.

thunar ★★★★★
()

Ну хотя объяснять что-то здесь смысла имеет мало. У автор в принципе нету ни вкуса, ни понимания языка, ни программирования в целом.

Обычный вчерашний домохозяин, которого научили пару трюков. Он их перепащивает и в принципе не думает. { 0 } - вот эта херня, допустим.

rafyibofye
()
Ответ на: комментарий от thunar

Нету никаких «статичных массивов». Упаковка в агрегат - это уже скоуп, в котором можно аллоцировать память.

Сам же агрегат является копируемым типом.

rafyibofye
()

Вот индекс - ты передаёшь, отлично. Но, вот где объект который нужно преобразовать?

pon4ik ★★★★★
()
Ответ на: комментарий от anonymous

Вот это я понимаю, настоящая, полезная подсказка.

seiken ★★★★★
() автор топика
Ответ на: комментарий от pon4ik

Об’ект хранится в месте вызова оператора. Но какие именно байты положить в массив - об этом знает только внутренняя логика об’екта.

seiken ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Можно, но это не массив с т.з. языка.

anonymous
()
Ответ на: комментарий от ox55ff

Можно. Но это динамически выделяемый массив, и обычно реализовано через кучу, а ее может и не быть.

seiken ★★★★★
() автор топика
Ответ на: комментарий от thunar

Ну лямбда это по идее функтор, а не функция, вроде как. Ну и просто так произвольную лямбду ты из функции тоже не вернёшь, она должна быть известна в компайл-тайме и всё, что в этом случае возвращается, это объект с данными этой лямбды.

Ivan_qrt ★★★★★
()
Ответ на: комментарий от seiken

Создавай массив на стороне вызывающей функции и передавай на него указатель через аргументы. Не будет копирования. Хотя сейчас есть оптимизация copy elision.

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

Создавай массив на стороне вызывающей функции и передавай на него указатель через аргументы.

Более того /не значит, что так нужно делать всегда/ можно разрабатывать лишь void функции, а результат возвращать в аргументах.
В этом случае зачастую аргументы лучше использовать как «&» или «&*».

У меня есть набор функций, которые имеют лишь один аргумент - контекст переменных.
В чем выгода думаю понятно.
Но конечно такой прием не всегда применим.

Владимир 123

anonymous
()
Ответ на: комментарий от anonymous

У меня есть набор функций, которые имеют лишь один аргумент - контекст переменных.

Шас пошучу.

Это вариант class в котором мухи и котлеты живут порознь

Владимир 123

anonymous
()

А как его можно вернуть? Какого действия ожидаешь при копировании?

S<10> s;
char ar[10];
ar = s;

У тебя под под ar кусок памяти на стеке, хочешь поэлементно копировать? А если там миллион элементов? std::array так и делает, в общем-то, можно его взять. Если очень хочется встроенный масив в функцию передать (сохранив размер), то пиши так:

#include <iostream>

template <int n>
struct S {
	void fn(char(&array)[n]) {
		for (char &i : array)
			i = 3;
	}
};
int main () {
	char ar[5] = {};
	S<5>().fn(ar);

	for (char &i : ar)
		std::cout << (int)i << '\n';
	return 0;
}

И копируй в массив как хочется.

pavlick ★★
()
Последнее исправление: pavlick (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.