Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Svet2
0 / 0 / 0
Регистрация: 21.06.2015
Сообщений: 2
1

Почему для временного безымянного объекта не вызывается оператор ()?

21.06.2015, 12:30. Просмотров 311. Ответов 5
Метки нет (Все метки)

Почему AddValue(value)(*pos); не вызывает operator()(int &elem) из класса AddValue?
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class AddValue
{
public:
    AddValue(int value)
        : value(value)
    {
    }
 
    void operator()(int &elem) const
    {
        elem += value;
    }
 
private:
    int  value;
};
 
 
 
int main()
{
    vector<int> coll;
    int  value;
 
    for (int i = 1; i <= 9; i++)
        coll.push_back(i);
    // coll = 1 2 3 4 5 6 7 8 9
 
 
    cout << "Enter value: ";
    cin >> value;
 
    {
        for (vector<int>::iterator pos=coll.begin(); pos!=coll.end(); pos++)
            AddValue(value)(*pos);   // Не вызывается оператор () для класса AddValue
    }
 
    
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2015, 12:30
Ответы с готовыми решениями:

Почему при помещении объекта в list вызывается конструктор и деструктор?
Нужна помощь опытного программиста. Не могу понять почему при помещение объекта в list вызывается...

Почему не вызывается конструктор копирования при возврате объекта из функции
Добрый день! Насколько мне известно, конструктор копирования вызывается: 1) при передачи...

Почему конструктор вызывается при присвоении объекта другому объекту
оператор+ выполняется нормально, но когда уже переменная в sum, на след шаге она вызывает...

В какой момент вызывается конструктор для глобального объекта, использующего статическое выделение памяти?
В какой момент вызывается конструктор для глобального объекта, использующего статическое выделение...

Будет ли утрачена память, когда конструктор копирования вызывается для уже существующего объекта класса?
class A { char * v; A(); ~A(); A(const A &amp;obj); } ///////////////////// A::A() {

5
Croessmah
++Ͻ
14777 / 8453 / 1605
Регистрация: 27.09.2012
Сообщений: 20,803
Записей в блоге: 2
Завершенные тесты: 1
21.06.2015, 12:34 2
С чего взяли, что не вызывается?
0
Svet2
0 / 0 / 0
Регистрация: 21.06.2015
Сообщений: 2
21.06.2015, 12:47  [ТС] 3
Но ведь вектор не изменяется. Если бы вызывался operator(), то числа изменились бы. А они те же самые

Добавлено через 4 минуты
И если в operator() написать cout << "operator"; то на консоль ничего не выводится. Никаких сообщений
Значит этот оператор не вызывается

Добавлено через 3 минуты
Но если немного исправить программу, и создать именной временный объект, то все OK
C++
1
2
3
4
5
6
    {
        AddValue  temp(value);
 
        for (vector<int>::iterator pos=coll.begin(); pos!=coll.end(); pos++)
            temp(*pos);
    }
Но почему с безымянным объектом не вызывается?
0
Croessmah
++Ͻ
14777 / 8453 / 1605
Регистрация: 27.09.2012
Сообщений: 20,803
Записей в блоге: 2
Завершенные тесты: 1
21.06.2015, 12:51 4
Цитата Сообщение от Svet2 Посмотреть сообщение
Но почему с безымянным объектом не вызывается?
Для раздумий:
C++
1
2
    AddValue(value)(*pos) ; // Не вызывается оператор () для класса AddValue
    value(*pos) ;
1
Tulosba
:)
Эксперт С++
4750 / 3244 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
21.06.2015, 13:21 5
C++
1
(AddValue(value))(*pos);
Цитата Сообщение от Svet2 Посмотреть сообщение
C++
1
AddValue(value)(*pos);
Проясняю ситуацию. В этой строчке создается объект типа AddValue с именем value и в качестве параметра конструктора передается значение *pos.
Т.о. это эквивалентно записи:
C++
1
AddValue value(*pos);
Здесь уже четко видно, что нет никакого вызова operator().
Если поставить дополнительные скобки, как я показал ранее, смысл меняется.
1
Croessmah
++Ͻ
14777 / 8453 / 1605
Регистрация: 27.09.2012
Сообщений: 20,803
Записей в блоге: 2
Завершенные тесты: 1
21.06.2015, 13:32 6
Цитата Сообщение от Tulosba Посмотреть сообщение
Проясняю ситуацию.
Добавлю
6.8 Ambiguity resolution
1. There is an ambiguity in the grammar involving expression-statements and declarations: An expression-statement with a function-style explicit type conversion (5.2.3) as its leftmost subexpression can be indistinguishable from a declaration where the first declarator starts with a (. In those cases the statement is a declaration.

2. [ Note: If the statement cannot syntactically be a declaration, there is no ambiguity, so this rule does not
apply. The whole statement might need to be examined to determine whether this is the case. This resolves
the meaning of many examples. [ Example: Assuming T is a simple-type-specifier (7.1.6),
C++
1
2
3
4
5
6
7
8
T(a)->m = 7;//expression-statement
T(a)++;//expression-statement
T(a,5)<<c;//expression-statement
 
T(*d)(int);//declaration
T(e)[5];//declaration
T(f) = { 1, 2 };//declaration
T(*g)(double(3));//declaration
In the last example above, g, which is a pointer to T, is initialized to double(3). This is of course ill-formed
for semantic reasons, but that does not affect the syntactic analysis. — end example ]
The remaining cases are declarations. [ Example:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class T {
// ...
public:
   T();
   T(int);
   T(int, int);
};
 
T(a); //declaration
T(*b)(); //declaration
T(c)=7; //declaration
T(d),e,f=3; //declaration
extern int h; 
T(g)(h,2); //declaration
— end example ] — end note ]
2
21.06.2015, 13:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2015, 13:32

Cout like: перегрузить оператор<< по примеру объекта cout для extern объекта пользовательского типа
Мне нужен extern объект по примеру cout с перегруженным оператором. Я нечто подобное сделал, только...

Копирование из временного объекта
1) Собственно, как работает такой конструктор? Хотелось бы какой-нибудь пример. 2) Сильно ли...

Время жизни временного объекта
можно ли передать временный объект в функцию по ссылке? void f1(int &amp; ); ..... int...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru