вопрос по auto_ptr
От: Сray  
Дата: 14.01.03 06:13
Оценка:
Есть некая функция:
void Foo() {
    auto_ptr<int> Ptr1;
    auto_ptr<int> Ptr2();
    auto_ptr<int> Ptr3(0);
}

После трансляции получается (VC6):
621:      auto_ptr<int> Ptr1;
004266C7 6A 00                push        0
004266C9 8D 4D E8             lea         ecx,[ebp-18h]
004266CC E8 D9 AE FD FF       call        @ILT+1445(std::auto_ptr<int>::auto_ptr<int>) (004015aa)
004266D1 C7 45 FC 00 00 00 00 mov         dword ptr [ebp-4],0
622:      auto_ptr<int> Ptr2();
623:      auto_ptr<int> Ptr3(0);
004266D8 6A 00                push        0
004266DA 8D 4D E0             lea         ecx,[ebp-20h]
004266DD E8 C8 AE FD FF       call        @ILT+1445(std::auto_ptr<int>::auto_ptr<int>) (004015aa)
004266E2 C6 45 FC 01          mov         byte ptr [ebp-4],1

Почему
auto_ptr<int> Ptr2();

не транслируется, а Ptr3(0) транслируется? Ведь в конструкторе auto_ptr по умолчанию тоже 0 используется.
explicit auto_ptr(_Ty *_P = 0)
Re: вопрос по auto_ptr
От: Znow  
Дата: 14.01.03 06:16
Оценка: 23 (3)
Здравствуйте, Сray, Вы писали:

Удалено избыточное цитирование. -- ПК.

С>Почему

С>
С>auto_ptr<int> Ptr2();
С>

С>не транслируется, а Ptr3(0) транслируется? Ведь в конструкторе auto_ptr по умолчанию тоже 0 используется.

Потому что обозначает нечто иное — объявление функции Ptr2 с пустым списком формальных параметров, возвращающей auto_ptr<int>.
Re[2]: вопрос по auto_ptr
От: Сray  
Дата: 14.01.03 06:36
Оценка:
Здравствуйте, Znow, Вы писали:

Z>Здравствуйте, Сray, Вы писали:


С>>
С>>void Foo() {
С>>    auto_ptr<int> Ptr1;
С>>    auto_ptr<int> Ptr2();
С>>    auto_ptr<int> Ptr3(0);
С>>}
С>>

С>>После трансляции получается (VC6):
С>>...
С>>Почему
С>>
С>>auto_ptr<int> Ptr2();
С>>

С>>не транслируется, а Ptr3(0) транслируется? Ведь в конструкторе auto_ptr по умолчанию тоже 0 используется.

Z>Потому что обозначает нечто иное — объявление функции Ptr2 с пустым списком формальных параметров, возвращающей auto_ptr<int>.


Если написать, например, такую ф-цию:
void Func(int i=0) {
}

то вызовы Func(0) и Func() эквивалентны.
Почему-же в описанном случае так не происходит? Из-за explicit?
Re[3]: вопрос по auto_ptr
От: Znow  
Дата: 14.01.03 06:45
Оценка:
Здравствуйте, Сray, Вы писали:

С>Здравствуйте, Znow, Вы писали:


С>Если написать, например, такую ф-цию:

С>
С>void Func(int i=0) {
С>}
С>

С>то вызовы Func(0) и Func() эквивалентны.
С>Почему-же в описанном случае так не происходит? Из-за explicit?

Нет, просто, раз конструкция может быть проинтерпретирована как объявление функции, она так и интерпретируется.

auto_ptr<int> Ptr1;
auto_ptr<int> Ptr3(0);


Эти конструкции не могут быть проинтерпретированы как объявления функций, они интерпретируются как определения объектов.
Re: вопрос по auto_ptr
От: cpp Россия http://www.elecard.com
Дата: 14.01.03 06:45
Оценка:
Здравствуйте, Сray, Вы писали:

С>Есть некая функция:

С>
С>void Foo() {
С>    auto_ptr<int> Ptr1;
С>    auto_ptr<int> Ptr2();
С>    auto_ptr<int> Ptr3(0);
С>}
С>

С>После трансляции получается (VC6):
С>
С>621:      auto_ptr<int> Ptr1;
С>004266C7 6A 00                push        0
С>004266C9 8D 4D E8             lea         ecx,[ebp-18h]
С>004266CC E8 D9 AE FD FF       call        @ILT+1445(std::auto_ptr<int>::auto_ptr<int>) (004015aa)
С>004266D1 C7 45 FC 00 00 00 00 mov         dword ptr [ebp-4],0
С>622:      auto_ptr<int> Ptr2();
С>623:      auto_ptr<int> Ptr3(0);
С>004266D8 6A 00                push        0
С>004266DA 8D 4D E0             lea         ecx,[ebp-20h]
С>004266DD E8 C8 AE FD FF       call        @ILT+1445(std::auto_ptr<int>::auto_ptr<int>) (004015aa)
С>004266E2 C6 45 FC 01          mov         byte ptr [ebp-4],1
С>

С>Почему
С>
С>auto_ptr<int> Ptr2();
С>

С>не транслируется, а Ptr3(0) транслируется? Ведь в конструкторе auto_ptr по умолчанию тоже 0 используется.
С>
С>explicit auto_ptr(_Ty *_P = 0)
С>


explicit конструкторы вызываются только при явном задании аргумента.
Сергей.
Re[3]: вопрос по auto_ptr
От: m.a.g. Мальта http://dottedmag.net/
Дата: 14.01.03 06:49
Оценка: 2 (1)
Здравствуйте, Сray, Вы писали:

С>>>Почему

С>>>
С>>>auto_ptr<int> Ptr2();
С>>>

С>>>не транслируется, а Ptr3(0) транслируется? Ведь в конструкторе auto_ptr по умолчанию тоже 0 используется.

Z>>Потому что обозначает нечто иное — объявление функции Ptr2 с пустым списком формальных параметров, возвращающей auto_ptr<int>.


С>Если написать, например, такую ф-цию:

С>
С>void Func(int i=0) {
С>}
С>

С>то вызовы Func(0) и Func() эквивалентны.
С>Почему-же в описанном случае так не происходит? Из-за explicit?

Потому что в стандарте написано, что в случае лексической неоднозначности "объявление функции — создание объекта" предпочтение отдается форме "объявление функции".
... << Павел Фомичев [Стихии] Дух ветра >> ...
Re[2]: вопрос по auto_ptr
От: Сray  
Дата: 14.01.03 07:11
Оценка:
С>>Почему
С>>
С>>auto_ptr<int> Ptr2();
С>>

С>>не транслируется, а Ptr3(0) транслируется? Ведь в конструкторе auto_ptr по умолчанию тоже 0 используется.
С>>
С>>explicit auto_ptr(_Ty *_P = 0)
С>>


cpp>explicit конструкторы вызываются только при явном задании аргумента.


А для чего тогда там в параметрах написано "_P = 0" ? Да и в Ptr1 ничего не задано, а компилируется несмотря на explicit.
Re[2]: вопрос по auto_ptr
От: cpp Россия http://www.elecard.com
Дата: 14.01.03 07:13
Оценка:
Здравствуйте, cpp, Вы писали:

Извиняюсь, я с похмеля болею....

в данном случае
auto_ptr<int> Ptr2();
компилер принимает за объявление функции. Вот.
Сергей.
Re[4]: вопрос по auto_ptr
От: Сray  
Дата: 14.01.03 07:14
Оценка:
Здравствуйте, m.a.g., Вы писали:
MAG>Потому что в стандарте написано, что в случае лексической неоднозначности "объявление функции — создание объекта" предпочтение отдается форме "объявление функции".

Ясно. Спасибо.
Re[2]: вопрос по auto_ptr
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 14.01.03 07:25
Оценка:
Здравствуйте, cpp, Вы писали:

cpp>explicit конструкторы вызываются только при явном задании аргумента.

Разве?

C++ Standard, 12.3.1/2

An explicit constructor constructs objects just like non-explicit constructors, but does so only where the direct-initialization syntax (8.5) or where casts (5.2.9, 5.4) are explicitly used. A default constructor may be an explicit constructor; such a constructor will be used to perform default-initialization (8.5).


Т.е. explicit означает, что данный конструктор не будет использоваться для неявных преобразований.
... << RSDN@Home 1.0 beta 4 >>
Re[3]: вопрос по auto_ptr
От: cpp Россия http://www.elecard.com
Дата: 14.01.03 08:06
Оценка:
Здравствуйте, Михаил Можаев, Вы писали:

ММ>Т.е. explicit означает, что данный конструктор не будет использоваться для неявных преобразований.


Я в курсе.
Болею я, говорю же....
Сергей.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.