Конструктор от rvalue объекта
От: C0x  
Дата: 02.04.14 13:17
Оценка:
По стандарту 2003 должен один раз конструктор вызваться или два?
Тоесть "0" или "01"?
class A
{
    int x;
public:
    A() : x(0) {
        std::cout << "0";
    }

    A(const A &a)
    {
        std::cout << "1";
    }
};

int main(int argc, char* argv[])
{
    using namespace std;

    A a((A())); //?
}
Re: Конструктор от rvalue объекта
От: watchmaker  
Дата: 02.04.14 13:37
Оценка:
Здравствуйте, C0x, Вы писали:

C0x>По стандарту 2003 должен один раз конструктор вызваться или два?

C0x>Тоесть "0" или "01"?

По стандарту допустимы оба варианта.
Re[2]: Конструктор от rvalue объекта
От: C0x  
Дата: 02.04.14 13:42
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>По стандарту допустимы оба варианта.


Тоесть это приведет к undefined behaviour?
Re[3]: Конструктор от rvalue объекта
От: watchmaker  
Дата: 02.04.14 13:51
Оценка:
Здравствуйте, C0x, Вы писали:

C0x>Здравствуйте, watchmaker, Вы писали:


W>>По стандарту допустимы оба варианта.


C0x>Тоесть это приведет к undefined behaviour?


Нет, конечно, undefined behaviour тут не будет.
Реализация вольна выбирать в каждом конкретном примере такого кода будет ли использовано copy elision или нет. Твоя программа может при использовании одного компилятора (или набора настроек компилятора) выдавать всегда "01", при использовании второго компилятора выдавать всегда "0", а при использовании третьего компилятора выдавать "01" в будни и "0" в выходные дни. Но в каждом случает это поведение полностью определено.
Re[4]: Конструктор от rvalue объекта
От: C0x  
Дата: 02.04.14 14:06
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Реализация вольна выбирать в каждом конкретном примере такого кода будет ли использовано copy elision или нет. Твоя программа может при использовании одного компилятора (или набора настроек компилятора) выдавать всегда "01", при использовании второго компилятора выдавать всегда "0", а при использовании третьего компилятора выдавать "01" в будни и "0" в выходные дни. Но в каждом случает это поведение полностью определено.


Из педивикии.

Неопределённое поведение (англ. undefined behaviour) — свойство некоторых языков программирования (наиболее заметно в Си), программных библиотек и аппаратного обеспечения в определённых маргинальных ситуациях выдавать результат, зависящий от реализации компилятора (библиотеки, микросхемы) и случайных параметров наподобие состояния памяти или сработавшего прерывания


Получается всетаки undefined behaviour.
Re[5]: Конструктор от rvalue объекта
От: Abyx Россия  
Дата: 02.04.14 14:12
Оценка:
Здравствуйте, C0x, Вы писали:

C0x>Здравствуйте, watchmaker, Вы писали:


W>>Реализация вольна выбирать в каждом конкретном примере такого кода будет ли использовано copy elision или нет. Твоя программа может при использовании одного компилятора (или набора настроек компилятора) выдавать всегда "01", при использовании второго компилятора выдавать всегда "0", а при использовании третьего компилятора выдавать "01" в будни и "0" в выходные дни. Но в каждом случает это поведение полностью определено.


C0x>Из педивикии.


C0x>

C0x>Неопределённое поведение (англ. undefined behaviour) — свойство некоторых языков программирования (наиболее заметно в Си), программных библиотек и аппаратного обеспечения в определённых маргинальных ситуациях выдавать результат, зависящий от реализации компилятора (библиотеки, микросхемы) и случайных параметров наподобие состояния памяти или сработавшего прерывания


C0x>Получается всетаки undefined behaviour.


не надо смотреть русскую (!) педивикию. смотри только стандарт.
в данном случае это называется implementation defined а ни как не UB
In Zen We Trust
Re[5]: Конструктор от rvalue объекта
От: watchmaker  
Дата: 02.04.14 14:19
Оценка: +1
Здравствуйте, C0x, Вы писали:

C0x>Здравствуйте, watchmaker, Вы писали:


W>>Реализация вольна выбирать в каждом конкретном примере такого кода будет ли использовано copy elision или нет. Твоя программа может при использовании одного компилятора (или набора настроек компилятора) выдавать всегда "01", при использовании второго компилятора выдавать всегда "0", а при использовании третьего компилятора выдавать "01" в будни и "0" в выходные дни. Но в каждом случает это поведение полностью определено.


C0x>Из педивикии.

C0x>Получается всетаки undefined behaviour.

Ну что такое? Ты же сам в первом сообщении спросил про стандарт! Если бы тебя волновало мнение из википедии, то так бы и спрашивал: "По википедии должен один раз конструктор вызваться или два?".

Ты понимаешь, что есть standard-defined behaviour, implementation-defined behavior, unspecified behavior и undefined behavior? И чем вообще все эти типы поведения отличаются?
Вот copy elision попадает в unspecified, а не не undefined behavior.




Смотри, вот аналогичная ситуация на примере многопоточности из c++11: у тебя есть функция, которая выводит номер потока, в котором её запустили. Ты запускаешь два потока с такой функцией (с номерами 0 и 1). Что выведет вся программа? «01» или «10»? Очевидно, что оба вараинта возможны — смотря какой поток первым получит доступ к выводу. И хотя вывод программы и не единственный, но неопределенного поведения тут нет. Так и стандарт в этом случае не говорит, что будет обязательно выведено «01» — вместо этого он говорит, что будет выведено только один из этих двух вариантов, и другие результаты невозможны.

Так и твоя ситуация описывается в стандарте: вывод будет либо «0», либо «01», но не что-то третье. Как реализация будет выбирать между «0» и «01» — не важно.
Re[6]: Конструктор от rvalue объекта
От: C0x  
Дата: 02.04.14 14:59
Оценка:
Здравствуйте, watchmaker, Вы писали:

Спасибо, да чтото подзабыл про остальные типы поведения.
Re[6]: Конструктор от rvalue объекта
От: uzhas Ниоткуда  
Дата: 02.04.14 15:23
Оценка: +1
Здравствуйте, Abyx, Вы писали:

A>в данном случае это называется implementation defined а ни как не UB


я бы сказал, что это unspecified
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.