Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2013, 11:48   #1
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию Передача временного объекта в конструктор

Здравствуйте!
Код:
struct Not 
{
    Not()   { cout << "Not::def" << endl;} 
};

class Q
{
public:
    Q()		{ cout << "Q::def" << endl; }
    Q(Not)  { cout << "Q::not constr" << endl; }
};


int main()
{
    Q var( Not::Not() );
    return 0;
}
В MSVC полагался на указанный способ, в MinGw он оказался незаконным. Поэтому, начал делать так:
Код:
struct Not {Not()  
{
    cout << "Not::def" << endl;}
};

class Q
{
public:
    Q()		{ cout << "Q::def" << endl; }
    Q(Not)          { cout << "Q::not constr" << endl; }
};

template <typename _Ty, typename... _Arg>
    _Ty construct(_Arg... arg)   { return _Ty(arg...); }   // конструируем временный объект

int main()
{
    Q var( construct<Not>() );
   return 0;
}
Меня не покидает чувство, что я изобретаю велосипед и скорее всего решение есть в std?
220Volt вне форума Ответить с цитированием
Старый 20.04.2013, 13:42   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Попробуйте конструктор
Q(const Not&);
waleri вне форума Ответить с цитированием
Старый 20.04.2013, 13:56   #3
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Не получится
Код:
Q var( Not );	// Компилятор считает, что это объявление функции.
	Q var( Not() );	// Компилятор считает, что это объявление функции.
В принципе, вопрос решается парой строк (шаблонная функция), но мне кажется, то, что может решаться через std, должно решаться через std.
220Volt вне форума Ответить с цитированием
Старый 20.04.2013, 18:56   #4
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Лямбда выражения помогают решить проблему:
Код:
Q var( [](){return Not();}() );

Последний раз редактировалось 220Volt; 20.04.2013 в 19:04. Причина: опечатка
220Volt вне форума Ответить с цитированием
Старый 20.04.2013, 20:07   #5
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

но ты не просто передаешь его в конструктор, а копируешь. Передавать ссылку на временный объект, как советует валерий тоже нехорошо, он же временный...
в с++11 есть r-значения - что то типа
Q(Not&&);
вот их можно попробовать тут использовать, при этом временный объект должен перемещаться в функцию.
Цитата:
Код:
Q var( Not() );	// Компилятор считает, что это объявление функции.
странно, и никакие Q var( (Not)Not() ); не помогают? - тока лямбда?
rrrFer вне форума Ответить с цитированием
Старый 21.04.2013, 03:33   #6
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
...
странно, и никакие Q var( (Not)Not() ); не помогают? - тока лямбда?
А я вот так не пробовал )), помогает, спасибо.
220Volt вне форума Ответить с цитированием
Старый 21.04.2013, 10:50   #7
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

220Volt

Q var( Not ); // Компилятор считает, что это объявление функции.
Q var( Not() ); // Компилятор считает, что это объявление функции.


Q var( (Not()) ); // объявление переменной
Rififi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вставка объекта в map. Отрабатывают один конструктор и три деструктора theYozh Общие вопросы C/C++ 5 03.12.2012 00:15
Передача объекта zhenya.ya Общие вопросы по Java, Java SE, Kotlin 2 19.06.2012 21:20
передача функции в конструктор класса Kukurudza Общие вопросы C/C++ 6 04.12.2011 08:31
передача параметра в конструктор пауэрлифтинг Общие вопросы Delphi 2 27.04.2010 21:27
Оптимизируем return объекта; конструктор копирования Kn793 Общие вопросы C/C++ 2 24.04.2010 20:26