Форум программистов, компьютерный форум CyberForum.ru

Область видимости анонимного объекта при вызове функции - C++

Восстановить пароль Регистрация
 
brick12
0 / 0 / 0
Регистрация: 22.07.2014
Сообщений: 4
22.07.2014, 09:29     Область видимости анонимного объекта при вызове функции #1
Доброго дня.
Хотел поинтересоваться: когда уничтожится анонимный объект, переданный как параметр функции?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <string>
 
using namespace std;
class Obj{
private:
  string s;
public:
friend 
  Obj(){s("asd"); printf("construct\n");}
  ~Obj(){printf("destroy\n");}
  operator const char * (){ return s.c_str();}
  friend Obj & operator <<(Obj & obj, const char * arg);
};
 
Obj & operator <<(Obj & obj, const char * arg){ s.append(arg); return obj;}
void print(const char * msg){
 printf("here\n");
 
 
}
int main()
{
 print(Obj() << "eh one" << "one one one" << "many many one one one");
 return 0;
}
Собственно у меня получилось
> ./a.out
construct
here
destroy

Я правильно понимаю что объект уничтожается при выходе из функции? Если у кого завалялась ссылка на стандарт по этому поводу - киньте в меня
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2014, 09:29     Область видимости анонимного объекта при вызове функции
Посмотрите здесь:

Область видимости в С++ C++
Область видимости C++
C++ Проблема при вызове функции
C++ Область видимости
C++ Ошибка при вызове функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
22.07.2014, 09:33     Область видимости анонимного объекта при вызове функции #2
Цитата Сообщение от brick12 Посмотреть сообщение
Если у кого завалялась ссылка на стандарт по этому поводу - киньте в меня

12.2/3
When an implementation introduces a temporary object of a class that has a non-trivial constructor (12.1, 12.8), it shall ensure that a constructor is called for the temporary object. Similarly, the destructor shall be called for a temporary with a non-trivial destructor (12.4). Temporary objects are destroyed as the last step in evaluating the full-expression (1.9) that (lexically) contains the point where they were created. This is true even if that evaluation ends in throwing an exception. The value computations and side effects of destroying a temporary object are associated only with the full-expression, not with any specific subexpression.
Так же далее в стандарте описаны два случая, когда это не так и временный объект живет дольше
brick12
0 / 0 / 0
Регистрация: 22.07.2014
Сообщений: 4
22.07.2014, 09:48  [ТС]     Область видимости анонимного объекта при вызове функции #3
Исходя из вышенаписанного приведённый пример кода некорректен. Так как есть объект obj будет уничтожен после последовательного выполнения всех операторов `<<` как раз поле передачи в функцию указателя на содержащуюся в нём строку.

PS. Вот после таких вот фокусов программа начинает летать в случайных местах. Нiзенко-нiзенко. Видать к дождю/
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
22.07.2014, 09:56     Область видимости анонимного объекта при вызове функции #4
Цитата Сообщение от brick12 Посмотреть сообщение
Так как есть объект obj будет уничтожен после последовательного выполнения всех операторов `<<` как раз поле передачи в функцию указателя на содержащуюся в нём строку.
full-expression:
A full-expression is an expression that is not a subexpression of another expression. If a language construct is defined to produce an implicit call of a function, a use of the language construct is considered to be an expression for the purposes of this definition. A call to a destructor generated at the end of the lifetime of an object other than a temporary object is an implicit full-expression. Conversions applied to the result of an expression in order to satisfy the requirements of the language construct in which the expression appears are also considered to be part of the full-expression.
[ Example:
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct S {
    S(int i): I(i) { }
    int& v() { return I; }
private:
    int I;
};
S s1(1);   // full-expression is call of S::S(int)
S s2 = 2;  // full-expression is call of S::S(int)
void f() {
    if (S(3).v()) {  // full-expression includes lvalue-to-rvalue and int to bool conversions, performed before temporary is deleted at end of full-expression
 }
}
— end example ]
brick12
0 / 0 / 0
Регистрация: 22.07.2014
Сообщений: 4
22.07.2014, 12:11  [ТС]     Область видимости анонимного объекта при вызове функции #5
Следуя этой логике вызов
C++
1
Obj() << "eh one" << "one one one" << "many many one one one"
является полным выражением. Obj уничтожится только после отработки всех <<.

Главное чтобы у авторов компиляторов не было другого мнения на этот счёт.
Alex5
883 / 618 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
22.07.2014, 17:03     Область видимости анонимного объекта при вызове функции #6
Цитата Сообщение от brick12 Посмотреть сообщение
Собственно у меня получилось
> ./a.out
construct
here
destroy
brick12, у Вас компилируется эта программа?

C++
1
2
3
public:
friend 
  Obj() /*  error C2633: Obj: 'inline' является единственным допустимым классом хранения для конструкторов */
C++
1
2
Obj & operator <<(Obj & obj, const char * arg){ s.append(arg); return obj;}
/*  error C2065: s: необъявленный идентификатор */
Если же исправить эти ошибки и добавить
C++
1
2
3
4
void print(const char * msg){
 printf("here\n");
 printf("    msg: %s \n", msg );
}
то получается

construct
here
msg: asdeh oneone one onemany many one one one
destroy
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2014, 07:57     Область видимости анонимного объекта при вызове функции
Еще ссылки по теме:

При возврате объекта из функции пишет, что для объекта не определен констуктор копирования C++
C++ Почему в main(); При вызове объекта не выводится в консоль?
C++ Класс - Ошибки при вызове методов: В вызове функции отсутствует список аргументов

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
brick12
0 / 0 / 0
Регистрация: 22.07.2014
Сообщений: 4
23.07.2014, 07:57  [ТС]     Область видимости анонимного объекта при вызове функции #7
Да. Согласен. В коде чехорда. Накидывал по памяти и не особо внимательно ибо оригинал на linux машине доступ к которой через удалённый рабочий стол windows.
Yandex
Объявления
23.07.2014, 07:57     Область видимости анонимного объекта при вызове функции
Ответ Создать тему
Опции темы

Текущее время: 03:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru