вопрос по C++
Типа такого
CA test
{
int x[10];
CA b("testobj");
int y[10];
// как-нибудь поюзать x и y, чтоб компилятор не оптимизировал лишнего
return b;
}
И посмотреть, что будет для первого компилятора
Интересно
попробовал. ему все по фигу. все равно то же самое выдает
Второй вариант вроде логичный: функция CA test(void); перед тем как уничтожить локальный объект b делает return, а там происходит копирование. А первый компилятор - супер рюхливый видать, хе-хе И что же это за компилятор такой? Не VC и не BorlandBuilder.
В стандарте написано, что компилятор имеет право выкидывать "лишние" вызовы конструкторов копирования
Причем конструктор копирования может выкидываться даже если в нем есть побочные эффекты
Желательно с последними исправлениями
Не видел, но такие вещи (стандарты) лучше читать на языке оригинала, а то там и так черт ногу сломит, а если еще и переводчик наврет, то...
А на русском я могу быстро просматривать, заостряя внимание на нужных местах
И ляпы переводчиков обычно сразу видно
Просто последний год я отошел от плюсов, поэтому точно ответить не могу.
Откуда вы такую инфу берете? В инете? Я Страуструпа листал - ничего не нашел...
PS. "Рюхливый" компилятор - gcc 3.2.1, остальные 2 - gcc 2.96 и msvc 6.0
Реальный способ: читаешь по С++ пару книжек по заковыристей, и пару месяцев тусуешься на серьезном форуме по плюсам, пытаясь отвечать на все вопросы
Оставить комментарий
Landstreicher
Как возвращаются значения из функций.Точнее, что должна выдавать такая прога:
#include <iostream>
#include <string>
class CA
{
public:
CA(const std::string& name )
{ m_name = name; std::cout << "CA ctor " << name << "\n"; }
CA(const CA& s)
{ m_name = s.m_name + " copy"; std::cout << "CA copy ctor from " << s.m_name << "\n"; }
~CA { std::cout << "CA dtor " << m_name << "\n"; }
CA& operator = (const CA& s)
{ std::cout << "CA operator " << m_name << " = " << s.m_name << "\n"; }
const std::string& name const { return m_name; }
private:
std::string m_name;
};
void print(const CA& obj)
{
std::cout << "printing " << obj.name << "\n";
}
CA test
{
CA b("testobj");
return b;
}
int main
{
print(test;
return 0;
}
У меня тут 3 разных компилера выводят разные вещи.
Один вот так:
CA ctor testobj
printing testobj
CA dtor testobj
А два других вот так:
CA ctor testobj
CA copy ctor from testobj
CA dtor testobj
printing testobj copy
CA dtor testobj copy
Хотелось бы понять кто из них соотвествует стандарту, а кто нет. Или, может быть поведение не фиксировано, так что оба правы.
По идее, локальные объекты должны удаляться до возврата из функции, что противоречит (1). С другой сторон, копировать объект, потом стирать оригинал - пустая трата времени (мне не удалось придумать осмысленный пример, в котором подобное действие было нужно).
Кстати, догадайтесь какой компилер что выводит