LINUX.ORG.RU

хз, может потому что компилятор оптимизировал это и оно параллельно выполняется? ну а параллельная запись может ломать прогу в таком виде, попробуй атомарный тип использовать. Больше идей пока нет :)

Onito
()

Скопмилировалось, но не заработало... Пащиму?

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

1. Скомпилировалось, потому что дизайн C++ — говно.

2. Не заработало, потому что значение переменной a используется до инициализации. Потому что см. пункт 1.

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

У тебя ж не double assignment, а инициализация.

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

Ну так хочешь по-порядку - ставь memory barrier )

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

Почему компилер вообще не ругается на выражения типа а = а...

А почему он должен ругаться? В «a = a = 1» нет UB. А в «A a = a = 1» — есть UB. С -Wall прекрасно ругается.

Ты уже определись, у тебя присваивание или инициализация?

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

Почему компилер вообще не ругается на выражения типа а = а...

Потому что у тебя не компилятор (clang), а говно (gcc).

warning: variable 'a' is uninitialized when used within its own initialization [-Wuninitialized]
    A a = a = 1;
      ~   ^
anonymous
()
Ответ на: комментарий от UVV

Почему компилер вообще не ругается на выражения типа а = а...

Так повелось. И в операторе присваивания надо сравнивать адрес полученного объекта с this, да.

yoghurt ★★★★★
()
Ответ на: комментарий от anonymous
$ cat 1.cc 

#include <iostream>

class MyClass {
	public:
	int v;
	MyClass(int v) {
		this->v = v;
	}
};

int main (void)
{
	MyClass a = a = 42;
	std::cout << a.v;
	return 0;
}

$ g++ -Wall -O2 1.cc
1.cc: В функции «int main()»:
1.cc:14:18: предупреждение: операция над «a» может дать неопределенный результат [-Wsequence-point]
  MyClass a = a = 42;
                  ^
1.cc:14:18: предупреждение: операция над «a» может дать неопределенный результат [-Wsequence-point]
$ g++ --version
g++ (GCC) 4.9.1
Deleted
()
Ответ на: комментарий от MKuznetsov

Пользуясь случаем, передаю привет конструктору boost::optional..

UVV ★★★★★
() автор топика

Wow! =)

Что это было? :-D

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

П.С. «this->v = v» - убиват!

Я не большой знаток плюсов, но осмелюсь спросить. Должно быть this.v = v, так как это класс, а не структура?

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

Должно быть this.v = v, так как это класс, а не структура?

Нет, this - это указатель, поэтому ->. В плюсах структура и класс это одно и то же.

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

Вообще говоря, должен быть прямой вызов конструктора:

class MyClass {
	public:
	int v;
	MyClass(int _v)
	: v(_v) { }
};

Но поскольку я на крестах говнокожу от силы раз в год...

Deleted
()

Потому, что, согласно стандарту, это UB.

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

а если быть точнее в терминологии, нужно использовать список инициализации конструктора.

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

Отвечу за ТС: вероятно он копипастил куски кода и не заметил двойного присваивания.

Типа того )

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

Просто когда в коде есть «i++ + ++i», то всем пофиг - ибо работает. Потом меняется версия компилятора или ещё чё-нить и возникает такой вопрос: как оно работало?

Вообще есть санитайзеры, да даже clang/gcc с -Wall, -pedantic понаходит такие UB.

nerdogeek
()
Последнее исправление: nerdogeek (всего исправлений: 1)
Ответ на: комментарий от Deleted

1. Скомпилировалось, потому что дизайн C++ — говно.

Многие так думают. А ещё они считают, что С - гораздо лучше. На самом деле, эта странность С++, как и многие другие, являются наследием С.

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

Многие так думают. А ещё они считают, что С - гораздо лучше. На самом деле, эта странность С++, как и многие другие, являются наследием С.

В данном случае говно унаследовано от plain C. Но это не оправдывает кресты ни в малейшей мере.

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

Но это не оправдывает кресты ни в малейшей мере.

А зачем их оправдывать? Это язык, который частично совместим с С, который вырос из него, и который не ломает совместимость при своей эволюции. Все адекватно и логично. Скорее надо оправдывать новые «С++-заменители», которые не могут достойно заменить дедушку с нелегкой судьбой из 80-х.

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

А зачем их оправдывать? Это язык, который частично совместим с С, который вырос из него, и который не ломает совместимость при своей эволюции.

Так в чем же тут совместимость, если унаследовано UB? Ни одна корректная программа не пострадала бы от слома данной конкретной «совместимости».

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

Так в чем же тут совместимость, если унаследовано UB?

У UB торчат ноги из тех самых 80-х, когда компиляторы не были такими продвинутыми. Кроме того UB (не все, но многие) это просто неотъемлемая часть продвинутых ассемблеров, коими во многом С и С++ и являются, стоит вылезти из уютной песочницы - и они поджидают тебя со всех сторон.

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

И какой уровень продвинутости компилятора необходим, чтобы запрещать использовать объект в той же sequence point, в которой он инициализируется? Это должно элементарно делаться на уровне резолвинга имён переменных при синтаксическом анализе. (Который Си неотделим от семантического - грамматика не КС.)

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

И какой уровень продвинутости компилятора необходим, чтобы запрещать использовать объект в той же sequence point, в которой он инициализируется?

В 80-е при борьбе за каждый байт и такт, и при том, что обезьян к программированию допускали меньше, это были вполне допустимые упрощения, чтоб облегчить жизнь авторам компиляторов. Сейчас же никто не мешает взять clang, выставить -Werror, и спокойно заниматься делом. А насчет стандарта - если в С изменят, то и в С++ подхватят, последний не зря так называется.

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

«работает» - это частный случай UB

Эпичная фраза, надо запомнить.

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