LINUX.ORG.RU

Оператор преборазования типа С++

 , const конвертер,


0

4

Господа, подскажите, пожалуйста, какое назначение имеет квалификатор const перед типом к которому приводится значение?

operator const T() const
{
	T t = T();
	for (unsigned i = 0; i < sizeof(T); i++)
		t |= T(bytes[i]) << (i << 3);
	return t;
}

Код целиком

Перемещено beastie из general


T t = T();

Зачем так писать? Компилятор конечно соптимизирует, но канонически здесь будет вызов ещё конструктора копирования. Надо так:

T t();

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

А ещё можно перегрузить запятую и наделать кучу макросов. И таким образом придумать новый язык, да.

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

Надо так:
T t();

Это должно объявить функцию t которая ничего не принимает и возвращает объект типа T. Скорее уж писать так:

T t;

xaizek ★★★★★
()

в этом ИТТ треде мы показываем всю мощь С++, перед которой даже GLR(inf) упадет. Если открыть исходники LLVM, то увидим, что все функции классов имеют ввид: T func(...) { ...code...} T func(...) const { const_cast<decltype(this)>(this)->func(...) } Вот это я понимаю, мощь С++, красота и превосходство.

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

А еще можно объявлять все mutable и все функции const, но тогда нафиг оно все нужно? Вот это я понимаю мощь, сила, превосходство.

anonymous
()

какое назначение имеет квалификатор const перед типом к которому приводится значение?

тип константный.

int main()
{
	const int x = 17;
	x = 22;//ошибка: присваивание переменной «x», доступной только на чтение
	return 0;
}
drBatty ★★
()
Ответ на: комментарий от xaizek

T t;

Тут опять проявляется «мощь C++»: у встроенных типов дефолтный конструктор не обязан ничего обнулять. Поэтому и приходится писать либо с фигурными скобочками, либо как у ТС.

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

у встроенных типов дефолтный конструктор не обязан ничего обнулять.

Либо я туплю с утра в понедельник, либо ты сказал бред. Что за встроенные типы? int? Так к ним вообще не применимо понятие конструктора, это тебе не ruby, где все типы являются классами.

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

The C++ Programming Language (Special Edition) Bjarne Stroustrup. Section 6 Expressions and Statements 6.2.8 Constructors

The construction of a value of type T from a value e can be expressed by the functional notation T(e). For Example:

void f(double d)
{
   int i = int(d);
}

The T(e) construct is sometimes referred to as a function-style cast. Unfortunately, for a built-in type T, T(e) is equivalent to (T)e.

The constructor notation T() is used to express the default value of type T.

void f(double d)
{
   int j = int();
}

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

ну дык это не противоречит тому, что написал я. для того же инта

int a = int();

Не вызовет никакого конструктора, чьё тело бы исполнилось. кароче не будет никакого call.

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

Ага, а еще добавить в «свои пацаны» с помощью friend, нарушая все правила дорожного движения.

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

Зачем так писать? Компилятор конечно соптимизирует, но канонически здесь будет вызов ещё конструктора копирования. Надо так:

Не будет. По стандарту T t = T(...) полностью эквивалентно T t(...), если T — класс.

vzzo ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.