Re: Инициализация в условии
От: Сергей Зизев Украина  
Дата: 03.08.05 06:12
Оценка: -2
Здравствуйте, SergeCpp, Вы писали:

SC>Здравствуйте,все!


SC>Очень странно...


SC>VC6 поддерживает

Ошибка в VC6

SC>if( int ok( 123 ) )

SC>{
SC> //...
SC>}

Выражение int ok( 123 ) есть ни что иное как определние функции, оно не может стоят в условии оператора if.
Условием оператора if может быть либо выражение либо декларатор, поэтому если Вы хотите внутри блока if объявить переменную ok и присвоить ей значение, то синтаксис должен быть такой:

if (int ok = 123) 
{
  std::cout << ok << std::endl; 
}
Re[3]: Инициализация в условии
От: Сергей Зизев Украина  
Дата: 03.08.05 07:18
Оценка: -2
Здравствуйте, SergeCpp, Вы писали:

[skipped...]

SC>Я не согласен с Вами.


SC>"int ok( 123 )" есть объявление объекта типа "int" с именем "ok"...

Нет, это не так, посмотри внимательно в 8.2/1, там есть почти такой же пример. В C++ данное выражение интерпретируется как объявление функции
с именем ok, возвращающей int и принимающей целое (тоже int). Существует надежда, что комитет когда-нибудь это исправит

SC>Дело НЕ в int.


SC>class SomeType

SC>{
SC>//... где-то тут ЕСТЬ конструктор с параметром типа "int"

SC>operator bool(){ return true; } // например

SC>};

SC>if( SomeType ok( 123 ) ) // конструируем из 123 и проверяем "не отходя от кассы"

Здесь аналогично, объявлена функция с именем ok, возвращающая SomeType и принимающая целое.

SC>Это РАБОТАЕТ в VC6

Это ошибка в VC6, в VC7.1 это подлечили
Re[3]: Инициализация в условии
От: Павел Кузнецов  
Дата: 04.08.05 04:38
Оценка: 21 (1)
SergeCpp,

S>

6.4 Selection statements

S> 1. Selection statements choose one of several flows of control.

S>

 selection-statement:
 S>     if     ( condition ) statement
 S>     if     ( condition ) statement else statement
 S>     switch ( condition ) statement

 S> condition:
 S>     expression
 S>     type-specifier-seq declarator = assignment-expression


S> ...

S> 5. If a condition can be syntactically resolved as
S> either an expression or the declaration of a local name,
S> it is interpreted as a declaration.


S> Согласно 5, if( int ok( 123 ) ) — допустимо,

S> хотя ЯВНЫМ образом и не указано в 1...

Нет, п. 5 говорит совсем о другом (см. ниже). Вообще же, грамматика
задает множество возможных предложений языка. Положения, выраженные
текстом, могут дополнительно ограничивать это множество. Т.е. все,
что через фильтр грамматики не проходит, дальнейшими текстовыми
пояснениями просто не учитывается.

S> "...can..."

S> int ok( 123 )
S> "... be syntactically resolved as... ...declaration..." ?
S> очевидно, да

Так вот, возвращаясь к п. 5. Нельзя его так резать. Наличие "или" в нем
существенно. Этот пункт говорит о том, что в случае наличия неоднозначности,
не разрешимой грамматикой, т.е. если некоторая конструкция может быть
разобрана и как выражение, и как объявление, компилятор должен выбрать
вариант с объявлением. Пример:
struct C
{
  C(int);
  C& operator =(int);
  operator bool() const;
};

int main()
{
  int i = 10;
  if( C(i) = 10 )
  {
    // ++i;
    return 1;
  }
}

В данном случае, если смотреть только на грамматику, игнорируя текстовые
правила стандарта, то выделенная строка может быть как выражением ("создать
временный объект типа C, проинициализированный переменной i, и присвоить
ему значение 10"), либо же объявлением ("объявить переменную i типа C,
и проинициализировать ее значением 10").

Если бы компилятор выбирал первый вариант, то можно было бы раскомментировать
строку с "++i", т.к. в этом случае она бы означала инкремент переменной int i,
определенной чуть выше. Однако, т.к. стандарт предписывает компилятору выбрать
именно второй вариант, если раскомментировать эту строку, программа станет
невалидной:
Comeau C/C++ 4.3.3 (Aug  6 2003 15:13:37) for ONLINE_EVALUATION_BETA1
Copyright 1988-2003 Comeau Computing.  All rights reserved.
MODE:strict errors C++

"ComeauTest.c", line 13: error: no operator "++" matches these operands
            operand types are: ++ C
      ++i;
      ^

"ComeauTest.c", line 10: warning: variable "i" was declared but never referenced
    int i = 10;
        ^

1 error detected in the compilation of "ComeauTest.c".


S> Самое большее, что здесь есть — так это некоторая НЕДОГОВОРЁННОСТЬ

S> о случае "if( int ok( 123 ) )", но считать его ОШИБКОЙ...

Нет там никакой недоговоренности, если не выдавать желаемое за действительное,
а просто читать стандарт, как он написан.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[10]: Инициализация в условии
От: Lorenzo_LAMAS  
Дата: 03.08.05 10:15
Оценка: 2 (1)
Ну, разница тут все же есть.
Есть прямая инициализация Т а1(а); и инициализация копированием Т а1 = а;
Вот что говорит стандарт

— If the destination type is a (possibly cv-qualified) class type:
...
If the initialization is direct-initialization, or if it is copy-initialization where the cv-unqualified version
of the source type is the same class as, or a derived class of, the class of the destination, constructors
are considered. The applicable constructors are enumerated (13.3.1.3), and the best one is
chosen through overload resolution (13.3). The constructor so selected is called to initialize the
object, with the initializer expression(s) as its argument(s).
If no constructor applies, or the overload
resolution is ambiguous, the initialization is ill-formed.
Otherwise (i.e., for the remaining copy-initialization cases), user-defined conversion sequences that
can convert from the source type to the destination type or (when a conversion function is used) to a
derived class thereof are enumerated as described in 13.3.1.4, and the best one is chosen through
overload resolution (13.3). If the conversion cannot be done or is ambiguous, the initialization is
ill-formed. The function selected is called with the initializer expression as its argument; if the function
is a constructor, the call initializes a temporary of the destination type. The result of the call
(which is the temporary for the constructor case) is then used to direct-initialize, according to the
rules above, the object that is the destination of the copy-initialization.
In certain cases, an implementation
is permitted to eliminate the copying inherent in this direct-initialization by constructing
the intermediate result directly into the object being initialized; see 12.2, 12.8.

Of course, the code must be complete enough to compile and link.
Re[7]: Инициализация в условии
От: Павел Кузнецов  
Дата: 04.08.05 05:28
Оценка: 1 (1)
SergeCpp,

ПК>> И почему этот случай нельзя "разрулить" таким образом?

ПК>>
 ПК>> {
 ПК>>  MyClass m(init);
 ПК>>  if (m)
 ПК>>  {
 ПК>>    . . .
 ПК>>  }
 ПК>> }
 ПК>>


S> Можно "разрулить" — НО


S> 1. "m" ОСТАЁТСЯ в scope после "if"

S> 2. ВАЖНО — "m" в Вашем примере "m" НЕ УНИЧТОЖИТСЯ в конце "if"

Я специально окружил предлагаемую замену фигурными скобками. Единственное
место, где будет разница -- if ... else ...
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[4]: Инициализация в условии
От: CrystaX Россия https://crystax.me/
Дата: 03.08.05 07:35
Оценка: +1
Здравствуйте, Сергей Зизев, Вы писали:

SC>>Я не согласен с Вами.


SC>>"int ok( 123 )" есть объявление объекта типа "int" с именем "ok"...

СЗ>Нет, это не так, посмотри внимательно в 8.2/1, там есть почти такой же пример. В C++ данное выражение интерпретируется как объявление функции
СЗ>с именем ok, возвращающей int и принимающей целое (тоже int). Существует надежда, что комитет когда-нибудь это исправит

Неверно. В объявлении функции не может быть целочисленного значения. Может быть только список формальных параметров. 123 не является формальным параметром. Для сравнения:

#include <iostream>

int main()
{
    int ok(123);

    std::cout << ok << std::endl; // Все хорошо, ok - это целочисленная переменная, ее значение 123

    return 0;
}


#include <iostream>

int main()
{
    size_t n = 1;
    int ok(int(n));

    std::cout << ok << std::endl; // А вот здесь уже неверно.
    // ok - это объявление функции, возвращающей int и принимающей также int.
    // Выражение int(n) по синтаксису является списком формальных параметров.

    return 0;
}
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[7]: Инициализация в условии
От: jazzer Россия Skype: enerjazzer
Дата: 03.08.05 12:40
Оценка: +1
Здравствуйте, CrystaX, Вы писали:

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


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


CX>>>
CX>>>#include <iostream>

CX>>>int main()
CX>>>{
CX>>>    size_t n = 1;
CX>>>    int ok(int(n));

CX>>>    std::cout << ok << std::endl; // А вот здесь уже неверно.
CX>>>    // ok - это объявление функции, возвращающей int и принимающей также int.
CX>>>    // Выражение int(n) по синтаксису является списком формальных параметров.

CX>>>    return 0;
CX>>>}
CX>>>


J>>а чего ж неверного :) распечатается адрес функции :)


CX>В данном коде нет. Функции-то нет! Есть только ее объявление. :)


А, ну да, не слинкуется.
Но скомпилиться — скомпилится, и если объектник в таком виде войдт в библиотеку, а потом кто-нть решит написать свою прогу с этой библиотекой... :))))
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Инициализация в условии
От: jazzer Россия Skype: enerjazzer
Дата: 11.08.05 13:48
Оценка: :)
Здравствуйте, SergeCpp, Вы писали:

SC>Здравствуйте!


SC>Переписка с Bjarne Stroustrup

SC>-----------------------------

SC>Смирнов Сергей wrote:


>>Good day, Dr. Stroustrup!


Он уже Prof. Stroustrup :)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Инициализация в условии
От: SergeCpp Россия http://zoozahita.ru
Дата: 03.08.05 05:24
Оценка:
Здравствуйте,все!

Очень странно...

VC6 поддерживает

if( int ok( 123 ) )
{
//...
}

а VC7 — ругается...

Это у всех VC7, или только в моей версии ?

(номер версии не помню, но одна из начальных 7)

Более реальный пример

if( PSTR pName( GetName() ) )
{
// do use pName
}

// не засоряется "scope"

Помогите ответом, пожалуйста...
http://zoozahita.ruБездомные животные Екатеринбурга ищут хозяев
Re[2]: Инициализация в условии
От: SergeCpp Россия http://zoozahita.ru
Дата: 03.08.05 06:24
Оценка:
Здравствуйте, Сергей Зизев, Вы писали:

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


SC>>Здравствуйте,все!


SC>>Очень странно...


SC>>VC6 поддерживает

СЗ>Ошибка в VC6

SC>>if( int ok( 123 ) )

SC>>{
SC>> //...
SC>>}

СЗ>Выражение int ok( 123 ) есть ни что иное как определние функции, оно не может стоят в условии оператора if.

СЗ>Условием оператора if может быть либо выражение либо декларатор, поэтому если Вы хотите внутри блока if объявить переменную ok и присвоить ей значение, то синтаксис должен быть такой:

СЗ>
СЗ>if (int ok = 123) 
СЗ>{
СЗ>  std::cout << ok << std::endl; 
СЗ>}
СЗ>



Я не согласен с Вами.

"int ok( 123 )" есть объявление объекта типа "int" с именем "ok"...

Дело НЕ в int.

class SomeType
{
//... где-то тут ЕСТЬ конструктор с параметром типа "int"

operator bool(){ return true; } // например
};

if( SomeType ok( 123 ) ) // конструируем из 123 и проверяем "не отходя от кассы"
{
// do use "ok"
}

Это РАБОТАЕТ в VC6
http://zoozahita.ruБездомные животные Екатеринбурга ищут хозяев
Re[5]: Инициализация в условии
От: Сергей Зизев Украина  
Дата: 03.08.05 08:38
Оценка:
Hello, CrystaX!
You wrote on Wed, 03 Aug 2005 07:35:53 GMT:

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


SC>>> Я не согласен с Вами.


[skipped...]

C> Неверно. В объявлении функции не может быть целочисленного значения.

Да, я был не прав.
C> Может быть только список формальных параметров. 123 не является
C> формальным параметром. Для сравнения:

Тогда почему же, все таки компилятор пытается интерпретировать выражение:
if (SomeType ok (123))
//...
как объявление функции ? Возможно по тому, что не может привести его к типу
bool ? Так оно и не приводимо к bool.

[skipped...]

With best regards, Sergey Zizyov. E-mail: ziserg@despammed.com
Posted via RSDN NNTP Server 1.9
Re[6]: Инициализация в условии
От: SergeCpp Россия http://zoozahita.ru
Дата: 03.08.05 08:48
Оценка:
Здравствуйте, Сергей Зизев, Вы писали:

[skipped...]

СЗ>как объявление функции ? Возможно по тому, что не может привести его к типу

СЗ>bool ? Так оно и не приводимо к bool.

СЗ>[skipped...]


СЗ>With best regards, Sergey Zizyov. E-mail: ziserg@despammed.com


Оператор "bool" был упомянут мною именно
для предотвращения "...Так оно и не приводимо к bool..."

Приводимо.

class SomeType
{
//... где-то тут ЕСТЬ конструктор с параметром типа "int"

operator bool(){ return true; } // <<< например
};

SomeType ok ( 123 );
bool val( ok ); // здесь вызывается SomeType::bool()...
http://zoozahita.ruБездомные животные Екатеринбурга ищут хозяев
Re: Инициализация в условии
От: Lorenzo_LAMAS  
Дата: 03.08.05 08:59
Оценка:
Вот как определен if в грамматике

6.4 Selection statements [stmt.select]
1 Selection statements choose one of several flows of control.
selection-statement:
if ( condition ) statement
if ( condition ) statement else statement
switch ( condition ) statement
condition:
expression
type-specifier-seq declarator = assignment-expression//т.е. нужен именно такой инициализатор = что-то

Of course, the code must be complete enough to compile and link.
Re[7]: Инициализация в условии
От: Сергей Зизев Украина  
Дата: 03.08.05 09:11
Оценка:
Hello, SergeCpp!
You wrote on Wed, 03 Aug 2005 08:48:12 GMT:

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


S> [skipped...]


СЗ>> как объявление функции ? Возможно по тому, что не может привести его к

СЗ>> типу bool ? Так оно и не приводимо к bool.

СЗ>> [skipped...]


СЗ>> With best regards, Sergey Zizyov. E-mail: ziserg@despammed.com


S> Оператор "bool" был упомянут мною именно

S> для предотвращения "...Так оно и не приводимо к bool..."

S> Приводимо.


S> class SomeType

S> {
S> //... где-то тут ЕСТЬ конструктор с параметром типа "int"

S> operator bool(){ return true; } // <<< например

S> };

S> SomeType ok ( 123 );

S> bool val( ok ); // здесь вызывается SomeType::bool()...
Да это все понятно, но речь идет о контексте оператора if (о его condition),
и получается что в данном контексте компилятор не может даже проверить
наличие твоего оператора bool у выражения SomeType ok ( 123 ), ввиду чего
пытается (это я так думаю) распарсить его как объявление функции, что
соответственно приводит к ошибке. Что бы все было ок, поставь равно, как я
писал в первом посте, тогда и твой оператор вызовется.


With best regards, Sergey Zizyov. E-mail: ziserg@despammed.com
Posted via RSDN NNTP Server 1.9
Re[8]: Инициализация в условии
От: SergeCpp Россия http://zoozahita.ru
Дата: 03.08.05 09:37
Оценка:
Здравствуйте, Сергей Зизев, Вы писали:

...

СЗ>соответственно приводит к ошибке. Что бы все было ок, поставь равно, как я

СЗ>писал в первом посте, тогда и твой оператор вызовется.


СЗ>With best regards, Sergey Zizyov. E-mail: ziserg@despammed.com


SomeType a( 1 );

SomeType b ( a ); // семантика этих двух строк
SomeType c = a; // сильно отличается

// не хочу цитировать Dr. Stroustrup, почитайте,
// там это детально объяснено

Всё же повторю уточнённый вопрос

if( int ok( 123 ) ) // проходит в самой новой версии VC7 ?
{
}
http://zoozahita.ruБездомные животные Екатеринбурга ищут хозяев
Re[9]: Инициализация в условии
От: Lorenzo_LAMAS  
Дата: 03.08.05 09:45
Оценка:
SC>SomeType a( 1 );

SC>SomeType b ( a ); // семантика этих двух строк

SC>SomeType c = a; // сильно отличается

Неверно. При таких типах объектов она идентична.
Of course, the code must be complete enough to compile and link.
Re[9]: Инициализация в условии
От: stasan  
Дата: 03.08.05 10:01
Оценка:
S> SomeType a( 1 );

S> SomeType b ( a ); // семантика этих двух строк

S> SomeType c = a; // сильно отличается

И там и там вызывается copy constructor. В чем разница?

S> // не хочу цитировать Dr. Stroustrup, почитайте,

S> // там это детально объяснено

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

S> Всё же повторю уточнённый вопрос


S>if( int ok( 123 ) ) // проходит в самой новой версии VC7 ?

S>{
S>}

Нет, на правильных компиляторах это работать не должно. Вам уже привели выдержку из стандарта. Используйте

if( int ok = 123 ) {
}

if( SomeType ok = 123 ) {
}


и все будет хорошо. Для SomeType будет вызываться тот же самый конструктор, который принимает int.

--
Stas
Posted via RSDN NNTP Server 1.9
Re[9]: Инициализация в условии
От: Сергей Зизев Украина  
Дата: 03.08.05 10:34
Оценка:
Hello, SergeCpp!
You wrote on Wed, 03 Aug 2005 09:37:47 GMT:

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


S> ...


СЗ>> соответственно приводит к ошибке. Что бы все было ок, поставь равно,

СЗ>> как я писал в первом посте, тогда и твой оператор вызовется.

СЗ>> With best regards, Sergey Zizyov. E-mail: ziserg@despammed.com


S> SomeType a( 1 );


S> SomeType b ( a ); // семантика этих двух строк

S> SomeType c = a; // сильно отличается

S> // не хочу цитировать Dr. Stroustrup, почитайте,

S> // там это детально объяснено
Причем здесь Страуструп к семантике оператора if, тем более отличия
direct-initialization от copy-initialization здесь вообще не причем.

S> Всё же повторю уточнённый вопрос


S> if( int ok( 123 ) ) // проходит в самой новой версии VC7 ?

S> {
S> }
Данный фрагмент кода неверен и он не проходит в VC7.1

With best regards, Sergey Zizyov. E-mail: ziserg@despammed.com
Posted via RSDN NNTP Server 1.9
Re[10]: Инициализация в условии
От: SergeCpp Россия http://zoozahita.ru
Дата: 03.08.05 10:45
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

SC>>SomeType a( 1 );


SC>>SomeType b ( a ); // семантика этих двух строк

SC>>SomeType c = a; // сильно отличается

L_L>Неверно. При таких типах объектов она идентична.


К сожалению, НЕ идентична...
http://zoozahita.ruБездомные животные Екатеринбурга ищут хозяев
Re[11]: Инициализация в условии
От: Lorenzo_LAMAS  
Дата: 03.08.05 10:49
Оценка:
Здравствуйте, SergeCpp, Вы писали:

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


SC>>>SomeType a( 1 );


SC>>>SomeType b ( a ); // семантика этих двух строк

SC>>>SomeType c = a; // сильно отличается

L_L>>Неверно. При таких типах объектов она идентична.


SC>К сожалению, НЕ идентична...

Если вас не затруднит, посмотрите для начала приведенную мною в этом обсуждении цитату из стандарта, после этого, продолжим (если будет охота)
Of course, the code must be complete enough to compile and link.
Re[11]: Инициализация в условии
От: stasan  
Дата: 03.08.05 11:45
Оценка:

Ну, разница тут все же есть.


Хмм, вы имеете ввиду то, что в первом случае используется direct-initalization, а во втором copy-initialization? Это конечно.
Но в данном контексте разницы нет, т.к. оба случая подпадают под пункт 1 приведенной из стандарта цитаты. Т.е. реально в
обоих случаях напрямую вызывается copy constructor, и разницы никакой нет. Или я что-то упустил?

Или вы имели ввиду следующий код:

if( SomeType ok = 123 ) {
}

?

Здесь конечно никто не гарантирует, что не будет вызываться copy-constructor, но я об этом и не говорил. Я лишь сказал, что будет вызван
тот же самый конструктор, принимающий int (класс SomeType из оригинального поста или где-то рядом). Да, возможно он будет вызван как
conversion constructor.

Или вы о чем-то другом?

PS. в любом случае, спасибо за цитату.

Offtopic:
Кстати. У меня последний стандарт от 1998 года. Есть более свежий? Если да, то где взять?

И парни, отличный форум. Кто бы мог подумать, что есть что-либо подобное в рунете.
The best one!

--
Stas
Posted via RSDN NNTP Server 1.9
Re[12]: Инициализация в условии
От: Lorenzo_LAMAS  
Дата: 03.08.05 11:54
Оценка:
Здравствуйте, stasan, Вы писали:

S>

S>Ну, разница тут все же есть.


S>Хмм, вы имеете ввиду то, что в первом случае используется direct-initalization, а во втором copy-initialization? Это конечно.


я уже забыл, чего мне показалось, вроде у меня вызвали подозрения слова про оператор присваивания
и темпорари (но если вы говорили не о Т а = 1, где нет присваивания, то все ОК).

S>Но в данном контексте разницы нет, т.к. оба случая подпадают под пункт 1 приведенной из стандарта цитаты. Т.е. реально в

S>обоих случаях напрямую вызывается copy constructor, и разницы никакой нет. Или я что-то упустил?

да, тут пункт 1.

S>PS. в любом случае, спасибо за цитату.


S>Offtopic:

S>Кстати. У меня последний стандарт от 1998 года. Есть более свежий? Если да, то где взять?

Такие вопросы не приветствуются
давай мыло
Of course, the code must be complete enough to compile and link.
Re[12]: Инициализация в условии
От: SergeCpp Россия http://zoozahita.ru
Дата: 03.08.05 12:06
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

...

SC>>К сожалению, НЕ идентична...

L_L>Если вас не затруднит, посмотрите для начала приведенную мною в этом обсуждении цитату из стандарта, после этого, продолжим (если будет охота)

Да, признаю, в этом случае, вероятно, так
(не пишу "наверняка так", потому что мне нужно думать —
ну торможу помаленьку...)

Но самое главное, из за чего мой вопрос возник — у меня НЕ "same class"...

"...if the function is a constructor,
the call initializes a temporary of the destination type..."

Вот в чём мой страх, несмотря на

"...In certain cases, an implementation is permitted to eliminate
the copying inherent in this direct-initialization by constructing
the intermediate result directly into the object being initialized..."

С уважением, Сергей Смирнов

P.S. Ничего личного — это ТЕХНИЧЕСКИЙ вопрос (НЕ мой выпендрёж)
http://zoozahita.ruБездомные животные Екатеринбурга ищут хозяев
Re[5]: Инициализация в условии
От: jazzer Россия Skype: enerjazzer
Дата: 03.08.05 12:14
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>
CX>#include <iostream>

CX>int main()
CX>{
CX>    size_t n = 1;
CX>    int ok(int(n));

CX>    std::cout << ok << std::endl; // А вот здесь уже неверно.
CX>    // ok - это объявление функции, возвращающей int и принимающей также int.
CX>    // Выражение int(n) по синтаксису является списком формальных параметров.

CX>    return 0;
CX>}
CX>


а чего ж неверного :) распечатается адрес функции :)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[13]: Инициализация в условии
От: Lorenzo_LAMAS  
Дата: 03.08.05 12:18
Оценка:
Здравствуйте, SergeCpp, Вы писали:

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


SC>...


SC>>>К сожалению, НЕ идентична...

L_L>>Если вас не затруднит, посмотрите для начала приведенную мною в этом обсуждении цитату из стандарта, после этого, продолжим (если будет охота)

SC>Да, признаю, в этом случае, вероятно, так

SC>(не пишу "наверняка так", потому что мне нужно думать -
SC>ну торможу помаленьку...)

SC>Но самое главное, из за чего мой вопрос возник — у меня НЕ "same class"...


я был осторожен и написал "при таких типах объектов"
У тебя все объекты типа

SomeType a( 1 );
SomeType b ( a ); // семантика этих двух строк
SomeType c = a; // сильно отличается


SC>"...if the function is a constructor,

SC>the call initializes a temporary of the destination type..."

а вот этот фрагмент-то относится к случаю, когда инициализатор (source) имеет не тот тип, что destination

SC>Вот в чём мой страх, несмотря на


SC>"...In certain cases, an implementation is permitted to eliminate

SC>the copying inherent in this direct-initialization by constructing
SC>the intermediate result directly into the object being initialized..."

это относится к виду

SomeType a = 1;

Здесь может быть просто вызов SomeType::SomeType(int)
и не быть создания промежуточнух копий, но это не относится к тому примеру, к которому я пристал
SC>С уважением, Сергей Смирнов

SC>P.S. Ничего личного — это ТЕХНИЧЕСКИЙ вопрос (НЕ мой выпендрёж)
Of course, the code must be complete enough to compile and link.
Re[6]: Инициализация в условии
От: CrystaX Россия https://crystax.me/
Дата: 03.08.05 12:20
Оценка:
Здравствуйте, jazzer, Вы писали:

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


CX>>
CX>>#include <iostream>

CX>>int main()
CX>>{
CX>>    size_t n = 1;
CX>>    int ok(int(n));

CX>>    std::cout << ok << std::endl; // А вот здесь уже неверно.
CX>>    // ok - это объявление функции, возвращающей int и принимающей также int.
CX>>    // Выражение int(n) по синтаксису является списком формальных параметров.

CX>>    return 0;
CX>>}
CX>>


J>а чего ж неверного распечатается адрес функции


В данном коде нет. Функции-то нет! Есть только ее объявление.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[13]: Инициализация в условии
От: stasan  
Дата: 03.08.05 12:22
Оценка:
OK, а то я уже испугался

--
Stas
Posted via RSDN NNTP Server 1.9
Re[14]: Инициализация в условии
От: SergeCpp Россия http://zoozahita.ru
Дата: 03.08.05 12:24
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>и не быть создания промежуточнух копий, но это не относится к тому примеру, к которому я пристал


И правильно пристали — я поторопился — и заслужил...

С уважением, Сергей Смирнов
http://zoozahita.ruБездомные животные Екатеринбурга ищут хозяев
Re: Инициализация в условии
От: SergeCpp Россия http://zoozahita.ru
Дата: 03.08.05 13:11
Оценка:
Согласитесь, синтаксис

if( PSTR pName( GetName() ) )
{
// do use pName
}

больше указывает на КОНСТРУИРОВАНИЕ объекта,
в то время как

if( PSTR pName = GetName() )
{
// do use pName
}

указывает на КОПИРОВАНИЕ
(и в некоторой степени уводит в сторону от
КОНСТРУИРОВАНИЯ)
http://zoozahita.ruБездомные животные Екатеринбурга ищут хозяев
Re[2]: Инициализация в условии
От: SergeCpp Россия http://zoozahita.ru
Дата: 04.08.05 02:36
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Вот как определен if в грамматике

L_L>

L_L>6.4 Selection statements [stmt.select]
L_L>1 Selection statements choose one of several flows of control.
L_L>selection-statement:
L_L>if ( condition ) statement
L_L>if ( condition ) statement else statement
L_L>switch ( condition ) statement
L_L>condition:
L_L>expression
L_L>type-specifier-seq declarator = assignment-expression//т.е. нужен именно такой инициализатор = что-то


Вот что говорит стандарт ISO/IEC 14882

citation >>>

6.4 Selection statements

1. Selection statements choose one of several flows of control.

selection-statement:
if ( condition ) statement
if ( condition ) statement else statement
switch ( condition ) statement

condition:
expression
type-specifier-seq declarator = assignment-expression

...

5. If a condition can be syntactically resolved as
either an expression or the declaration of a local name,
it is interpreted as a declaration.

<<< citation

Согласно 5, if( int ok( 123 ) ) — допустимо,
хотя ЯВНЫМ образом и не указано в 1...

"...can..."

int ok( 123 )

"... be syntactically resolved as... ...declaration..." ?

очевидно, да

Самое большее, что здесь есть — так это некоторая НЕДОГОВОРЁННОСТЬ
о случае "if( int ok( 123 ) )", но считать его ОШИБКОЙ...
http://zoozahita.ruБездомные животные Екатеринбурга ищут хозяев
Re[3]: Инициализация в условии
От: Centaur Россия  
Дата: 04.08.05 03:50
Оценка:
Здравствуйте, SergeCpp, Вы писали:

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


L_L>>Вот как определен if в грамматике

L_L>>

L_L>>6.4 Selection statements [stmt.select]
L_L>>1 Selection statements choose one of several flows of control.
L_L>>selection-statement:
L_L>>if ( condition ) statement
L_L>>if ( condition ) statement else statement
L_L>>switch ( condition ) statement
L_L>>condition:
L_L>>expression
L_L>>type-specifier-seq declarator = assignment-expression//т.е. нужен именно такой инициализатор = что-то


SC>Вот что говорит стандарт ISO/IEC 14882


SC>5. If a condition can be syntactically resolved as
SC> either an expression or the declaration of a local name,
SC> it is interpreted as a declaration.


SC>Согласно 5, if( int ok( 123 ) ) — допустимо,

SC>хотя ЯВНЫМ образом и не указано в 1...

SC>"...can..."


SC>int ok( 123 )


SC>"... be syntactically resolved as... ...declaration..." ?


SC>очевидно, да


SC>Самое большее, что здесь есть — так это некоторая НЕДОГОВОРЁННОСТЬ

SC>о случае "if( int ok( 123 ) )", но считать его ОШИБКОЙ...

Допустимый синтаксис описан в грамматике. int ok(123) этой грамматике не соответствует, поэтому в текущей редакции стандарта это ошибка. Пиши defect report, или как это называется…

А так вообще нужно делать классы, которые предполагается вот так использовать в if, копируемыми, и писать:
if (Resource r = Resource(хрр, брр))

Хороший оптимизатор это копирование выоптимизирует, а плохому можно помочь идиомой pimpl.
Re[4]: Инициализация в условии
От: SergeCpp Россия http://zoozahita.ru
Дата: 04.08.05 04:28
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Допустимый синтаксис описан в грамматике. int ok(123) этой грамматике не соответствует, поэтому в текущей редакции стандарта это ошибка. Пиши defect report, или как это называется…


C>А так вообще нужно делать классы, которые предполагается вот так использовать в if, копируемыми, и писать:

C>
C>if (Resource r = Resource(хрр, брр))
C>

C>Хороший оптимизатор это копирование выоптимизирует, а плохому можно помочь идиомой pimpl.

Описан в двух указанных мною местах по-разному...

А насчёт "выоптимизирует" — а что, если
СЕМАНТИКА копирования
в моём классе КОРЕННЫМ ОБРАЗОМ ОТЛИЧАЕТСЯ
от семантики КОНСТРУИРОВАНИЯ ?

Тут нужно быть на 100 % уверенным

P.S. Отправлено письмо Bjarne Stroustrup...
http://zoozahita.ruБездомные животные Екатеринбурга ищут хозяев
Re[5]: Инициализация в условии
От: Павел Кузнецов  
Дата: 04.08.05 04:53
Оценка:
SergeCpp,

C>> Допустимый синтаксис описан в грамматике. int ok(123) этой грамматике

C>> не соответствует, поэтому в текущей редакции стандарта это ошибка. Пиши
C>> defect report, или как это называется…

S> Описан в двух указанных мною местах по-разному...


Просто синтаксис задан грамматикой неоднозначно, текстовое дополнение эту
неоднозначность разрешает. Никакого противоречия там нет.

S> А насчёт "выоптимизирует" — а что, если

S> СЕМАНТИКА копирования
S> в моём классе КОРЕННЫМ ОБРАЗОМ ОТЛИЧАЕТСЯ
S> от семантики КОНСТРУИРОВАНИЯ ?

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

Ты можешь привести конкретный пример, где тебе существенно создание
дополнительного временного объекта в подобном случае?

И почему этот случай нельзя "разрулить" таким образом?
{
  MyClass m(init);
  if (m)
  {
    . . .
  }
}


S> Тут нужно быть на 100 % уверенным


В обоих случаях происходит конструирование. В одном из случаев может произойти
конструирование дополнительного временного объекта.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[6]: Инициализация в условии
От: SergeCpp Россия http://zoozahita.ru
Дата: 04.08.05 05:13
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Ты можешь привести конкретный пример, где тебе существенно создание

ПК>дополнительного временного объекта в подобном случае?

Конкретный пример у меня дома...

Но ведь СОЗДАНИЕ ДОПОЛНИТЕЛЬНОГО — это же очевидно — ИЗЛИШНЕ!

ПК>И почему этот случай нельзя "разрулить" таким образом?

ПК>
ПК>{
ПК>  MyClass m(init);
ПК>  if (m)
ПК>  {
ПК>    . . .
ПК>  }
ПК>}
ПК>


Можно "разрулить" — НО

1. "m" ОСТАЁТСЯ в scope после "if"
2. ВАЖНО — "m" в Вашем примере "m" НЕ УНИЧТОЖИТСЯ в конце "if"
http://zoozahita.ruБездомные животные Екатеринбурга ищут хозяев
Re[8]: Инициализация в условии
От: SergeCpp Россия http://zoozahita.ru
Дата: 04.08.05 05:42
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>SergeCpp,


ПК>>> И почему этот случай нельзя "разрулить" таким образом?

ПК>>>
 ПК>>> {
 ПК>>>  MyClass m(init);
 ПК>>>  if (m)
 ПК>>>  {
 ПК>>>    . . .
 ПК>>>  }
 ПК>>> }
 ПК>>>


S>> Можно "разрулить" — НО


S>> 1. "m" ОСТАЁТСЯ в scope после "if"

S>> 2. ВАЖНО — "m" в Вашем примере "m" НЕ УНИЧТОЖИТСЯ в конце "if"

ПК>Я специально окружил предлагаемую замену фигурными скобками. Единственное

ПК>место, где будет разница -- if ... else ...

Мягко говоря — НЕКРАСИВО...
http://zoozahita.ruБездомные животные Екатеринбурга ищут хозяев
Re[5]: Инициализация в условии
От: Centaur Россия  
Дата: 04.08.05 13:31
Оценка:
Здравствуйте, SergeCpp, Вы писали:

SC>А насчёт "выоптимизирует" — а что, если

SC>СЕМАНТИКА копирования
SC>в моём классе КОРЕННЫМ ОБРАЗОМ ОТЛИЧАЕТСЯ
SC>от семантики КОНСТРУИРОВАНИЯ ?

Очень плохо. Я умываю руки.
Re[6]: Инициализация в условии
От: SergeCpp Россия http://zoozahita.ru
Дата: 05.08.05 03:42
Оценка:
Здравствуйте, Centaur, Вы писали:

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


SC>>А насчёт "выоптимизирует" — а что, если

SC>>СЕМАНТИКА копирования
SC>>в моём классе КОРЕННЫМ ОБРАЗОМ ОТЛИЧАЕТСЯ
SC>>от семантики КОНСТРУИРОВАНИЯ ?

C>Очень плохо. Я умываю руки.


Ну а если этот класс — база данных ?

КОПИРОВАТЬ её я не хочу...

Хоть это и несколько указателей
(а со ссылками — ТЕМ БОЛЕЕ не очень)...
http://zoozahita.ruБездомные животные Екатеринбурга ищут хозяев
Re[7]: Инициализация в условии
От: Centaur Россия  
Дата: 05.08.05 04:26
Оценка:
Здравствуйте, SergeCpp, Вы писали:

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


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


SC>>>А насчёт "выоптимизирует" — а что, если

SC>>>СЕМАНТИКА копирования
SC>>>в моём классе КОРЕННЫМ ОБРАЗОМ ОТЛИЧАЕТСЯ
SC>>>от семантики КОНСТРУИРОВАНИЯ ?

C>>Очень плохо. Я умываю руки.


SC>Ну а если этот класс — база данных ?


SC>КОПИРОВАТЬ её я не хочу...


Если это действительно база данных, то есть большая коллекция объектов, то конструировать её посреди программы ты тоже не хочешь.

SC>Хоть это и несколько указателей

SC>(а со ссылками — ТЕМ БОЛЕЕ не очень)...

А если это абстракция подключения к базе данных — то его вполне можно сделать копируемым или, скажем, перемещаемым (как std::auto_ptr). Что до ссылок, то их можно заменить указателями без большого труда.
Re[8]: Инициализация в условии
От: SergeCpp Россия http://zoozahita.ru
Дата: 05.08.05 11:22
Оценка:
Здравствуйте, Centaur, Вы писали:

...

SC>>Ну а если этот класс — база данных ?


SC>>КОПИРОВАТЬ её я не хочу...


C>Если это действительно база данных, то есть большая коллекция объектов, то конструировать её посреди программы ты тоже не хочешь.


А кто сказал, что ПОСРЕДИ ?

SC>>Хоть это и несколько указателей

SC>>(а со ссылками — ТЕМ БОЛЕЕ не очень)...

C>А если это абстракция подключения к базе данных — то его вполне можно сделать копируемым или, скажем, перемещаемым (как std::auto_ptr). Что до ссылок, то их можно заменить указателями без большого труда.


...вполне можно... // некрасиво...
...без большого труда... // а МАЛЕНЬКИЙ труд тоже не нужен...
http://zoozahita.ruБездомные животные Екатеринбурга ищут хозяев
Re[13]: Инициализация в условии
От: Denwer Россия  
Дата: 05.08.05 12:16
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

S>>Offtopic:

S>>Кстати. У меня последний стандарт от 1998 года. Есть более свежий? Если да, то где взять?

L_L>Такие вопросы не приветствуются

L_L>давай мыло

Re[9]: Инициализация в условии
От: Centaur Россия  
Дата: 05.08.05 14:23
Оценка:
Здравствуйте, SergeCpp, Вы писали:

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


SC>>>Ну а если этот класс — база данных ?


SC>>>КОПИРОВАТЬ её я не хочу...


C>>Если это действительно база данных, то есть большая коллекция объектов, то конструировать её посреди программы ты тоже не хочешь.


SC>А кто сказал, что ПОСРЕДИ ?


А если бы он рождался в начале программы и жил бы всё время её выполнения, то там бы был не if, а исключение бы бросалось. А if говорит мне о том, что объект короткоживущий, легко конструируемый, и не особо важный для функционирования программы.
Re[10]: Инициализация в условии
От: SergeCpp Россия http://zoozahita.ru
Дата: 11.08.05 02:45
Оценка:
Здравствуйте, Centaur!

А как насчёт случая, когда для предотвращения копирования
конструктор копирования — запрещён
(объявлением его как private и отсутствием определения) ?
http://zoozahita.ruБездомные животные Екатеринбурга ищут хозяев
Re[11]: Инициализация в условии
От: Centaur Россия  
Дата: 11.08.05 03:14
Оценка:
Здравствуйте, SergeCpp, Вы писали:

SC>Здравствуйте, Centaur!


SC>А как насчёт случая, когда для предотвращения копирования

SC>конструктор копирования — запрещён
SC>(объявлением его как private и отсутствием определения) ?

Обходиться явным введением области видимости. Или писать предложение в Комитет.
// …some code…
{
  Class object(many, constructor, parameters);
  if (object)
  {
    do_the(right.thing);
  }
} // here it dies
// …more code…
Re[12]: Инициализация в условии
От: SergeCpp Россия http://zoozahita.ru
Дата: 11.08.05 03:33
Оценка:
Здравствуйте, Centaur, Вы писали:

C>...писать ... в Комитет... // ГБ... ?
http://zoozahita.ruБездомные животные Екатеринбурга ищут хозяев
Re: Инициализация в условии
От: SergeCpp Россия http://zoozahita.ru
Дата: 11.08.05 13:23
Оценка:
Здравствуйте!

Переписка с Bjarne Stroustrup
-----------------------------

Смирнов Сергей wrote:

>Good day, Dr. Stroustrup!

>
>----- Original Message -----
>From: "Bjarne Stroustrup" <bs@cs.tamu.edu>
>To: "Смирнов Сергей" <serge@gus.elcom.ru>
>Sent: Wednesday, August 10, 2005 9:20 PM
>Subject: Re: Simple question — Constructing in condition
>
>
>Смирнов Сергей wrote:
>
>
>
>>Good day, Dr. Stroustrup!
>>
>>It is "ok" to use code like following ?
>>
>>if( int ok( GetStatus() ) ) // "int" used as example only (i use object of
>>some class with "operator bool()" there)
>>
>>
>>
>>
>You need to use the = initialization syntax:
>
>if (int ok = GetStatus())
>
>==========================================
>What if = initialization constructor
>(to prevent from copy semantics -
>i read in standard that in case of "=" temporary
>could — though it may be optimized away — be created)
>made private and without definition ?
>
>Will be "if( SomeClass ok( GetStatus() ) )" valid anyway ?
>
>
No. I don't recall the reason for requiring the = syntax, but the
requirement is there. Yes, it means that there are a few things you
can't do, but I have not found that a serious problem.

>// SomeClass::operator bool() is properly defined there

>==========================================
>
>Sincerely yours, Sergey Smirnoff
>
>serge@gus.elcom.ru
>
>P.S. THANK YOU FOR THE BEST LANGUAGE
>
>P.P.S. Can you allow me to place your answers
>together with my questions to "Constructing in condition" topic
>on Russian Software Developer Network Forum ?
>
>Forum URL — http://rsdn.ru/Forum
>
>
>
>
sure.
http://zoozahita.ruБездомные животные Екатеринбурга ищут хозяев
Re[2]: Инициализация в условии
От: DDragon Россия  
Дата: 12.08.05 03:13
Оценка:
И все таки, с точки зрения стандарта:

int a=1;        // конструктор
int b(1);       // конструктор

int c=a;        // конструктор копирования
int d(a);       // конструктор копирования

int f(int);     // объявление функции
int g(int a);   // объявление функции
int h(int a=1); // объявление функции со значением по умолчанию

int j((int)1);  // конструктор
int i(int(1));  // конструктор

int i(int a(1));// конструктор или объявление функции ?
Re[3]: Инициализация в условии
От: Павел Кузнецов  
Дата: 12.08.05 03:21
Оценка:
DDragon,

> И все таки, с точки зрения стандарта:

>
> int a=1;        // конструктор
> int b(1);       // конструктор
>
> int c=a;        // конструктор копирования
> int d(a);       // конструктор копирования
>

У int нет конструкторов. Это все примеры инициализации, но конструкторы здесь ни при чем.

>
> int f(int);     // объявление функции
> int g(int a);   // объявление функции
> int h(int a=1); // объявление функции со значением по умолчанию
>

Да.

>
> int j((int)1);  // конструктор
> int i(int(1));  // конструктор
>

Инициализация.

>
> int i(int a(1));// конструктор или объявление функции ?
>

Ни то, ни другое: синтаксическая ошибка.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: Инициализация в условии
От: SergeCpp Россия http://zoozahita.ru
Дата: 12.08.05 03:22
Оценка:
Здравствуйте, DDragon, Вы писали:

DD>И все таки, с точки зрения стандарта:


DD>

DD>int c=a;        // конструктор копирования
DD>int d(a);       // конструктор копирования <<< не уверен...

DD>
http://zoozahita.ruБездомные животные Екатеринбурга ищут хозяев
Re[4]: Инициализация в условии
От: Павел Кузнецов  
Дата: 12.08.05 04:17
Оценка:
SergeCpp,

> DD>
> DD>int c=a;        // конструктор копирования
> DD>int d(a);       // конструктор копирования <<< не уверен...
> DD>


Это могло бы быть объявлением функции, только если бы a было бы именем типа. В данном случае это инициализация.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.