forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Вызов конструктора в списке аргументов функции (http://forum.boolean.name/showthread.php?t=17719)

wolfhound512 06.01.2013 13:22

Вызов конструктора в списке аргументов функции
 
Есть ли принципиальная разница между:
Код:

myClass tmp;
func( tmp );

и
Код:

func( myClass() );
?
Описание func()
Код:

void func(myClass& obj);
Второй вариант короче и удобнее, но не компилируется на GCC под Ubuntu, пишет что невозможно преобразовать myClass в myClass&

jimon 06.01.2013 15:27

Ответ: Вызов конструктора в списке аргументов функции
 
вариант с ошибкой :

Код:

class foo
{
public:
    int a;
    foo()
        :a(1)
    {
    }
};

void bar(foo & b)
{
}

int main()
{
    bar(foo());
    return 0;
}

Цитата:

prog.cpp: In function ‘int main()’:
prog.cpp:17: error: invalid initialization of non-const reference of type ‘foo&’ from a temporary of type ‘foo’
prog.cpp:11: error: in passing argument 1 of ‘void bar(foo&)’
собсно компилятор нам и говорит что такая запись не имеет смысла - если мы поменяем foo в функции то как нам вернуть результат ?

потому правильный вариант :

Код:

class foo
{
public:
    int a;
    foo()
        :a(1)
    {
    }
};
 
void bar(const foo & b)
{
}
 
int main()
{
    bar(foo());
    return 0;
}

и он компилируется без ошибки

wolfhound512 06.01.2013 17:01

Ответ: Вызов конструктора в списке аргументов функции
 
У меня GCC компилятор пишет именно о невозможности преобразования из myClass в myClass&, поэтому суть претензий не понятна была.
Но в студии такая функция работает нормально:
Код:

myClass& foo(myClass& obj) {
  \\изменение obj
  return obj;
}

foo( myClass() );

Для такого случая надо использовать исключительно первый вариант?

jimon 06.01.2013 18:23

Ответ: Вызов конструктора в списке аргументов функции
 
Цитата:

Сообщение от wolfhound512 (Сообщение 248489)
У меня GCC компилятор пишет именно о невозможности преобразования из myClass в myClass&, поэтому суть претензий не понятна была.
Но в студии такая функция работает нормально:
Код:

myClass& foo(myClass& obj) {
  \\изменение obj
  return obj;
}

foo( myClass() );

Для такого случая надо использовать исключительно первый вариант?

ну да, когда ты передаешь ссылку и создаешь класс inplace то получается временный объект, менять его смысла нету, он разрушится как только функция вернет результат, потому чтобы не плодить лишних багов такое поведение запретили в стандарте, а visual studio разрешает

можно конечно копнуть глубже, но нужно ли ? если уж сильно хочется то вот статья которая объясняет такое поведение http://blogs.msdn.com/b/vcblog/archi...10-part-2.aspx :crazy:

wolfhound512 06.01.2013 21:29

Ответ: Вызов конструктора в списке аргументов функции
 
Спасибо, полезная статья


Часовой пояс GMT +4, время: 04:55.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot