Здравствуйте, 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;
}
Здравствуйте, Сергей Зизев, Вы писали:
СЗ>Здравствуйте, 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"
}
[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 это подлечили
Здравствуйте, Сергей Зизев, Вы писали:
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 - это целочисленная переменная, ее значение 123return 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;
}
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
[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()...
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.
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
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.
Ну, разница тут все же есть.
Есть прямая инициализация Т а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.
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
Здравствуйте, Lorenzo_LAMAS, Вы писали:
SC>>SomeType a( 1 );
SC>>SomeType b ( a ); // семантика этих двух строк SC>>SomeType c = a; // сильно отличается
L_L>Неверно. При таких типах объектов она идентична.
Здравствуйте, 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.
Хмм, вы имеете ввиду то, что в первом случае используется direct-initalization, а во втором copy-initialization? Это конечно.
Но в данном контексте разницы нет, т.к. оба случая подпадают под пункт 1 приведенной из стандарта цитаты. Т.е. реально в
обоих случаях напрямую вызывается copy constructor, и разницы никакой нет. Или я что-то упустил?
Или вы имели ввиду следующий код:
if( SomeType ok = 123 ) {
}
?
Здесь конечно никто не гарантирует, что не будет вызываться copy-constructor, но я об этом и не говорил. Я лишь сказал, что будет вызван
тот же самый конструктор, принимающий int (класс SomeType из оригинального поста или где-то рядом). Да, возможно он будет вызван как
conversion constructor.
Или вы о чем-то другом?
PS. в любом случае, спасибо за цитату.
Offtopic:
Кстати. У меня последний стандарт от 1998 года. Есть более свежий? Если да, то где взять?
И парни, отличный форум. Кто бы мог подумать, что есть что-либо подобное в рунете.
The best one!
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.
...
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. Ничего личного — это ТЕХНИЧЕСКИЙ вопрос (НЕ мой выпендрёж)
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>
а чего ж неверного :) распечатается адрес функции :)
Здравствуйте, 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.
Здравствуйте, 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>а чего ж неверного распечатается адрес функции
В данном коде нет. Функции-то нет! Есть только ее объявление.
Здравствуйте, 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>В данном коде нет. Функции-то нет! Есть только ее объявление. :)
А, ну да, не слинкуется.
Но скомпилиться — скомпилится, и если объектник в таком виде войдт в библиотеку, а потом кто-нть решит написать свою прогу с этой библиотекой... :))))
Здравствуйте, 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.
Здравствуйте, Centaur, Вы писали:
C>Допустимый синтаксис описан в грамматике. int ok(123) этой грамматике не соответствует, поэтому в текущей редакции стандарта это ошибка. Пиши defect report, или как это называется…
C>А так вообще нужно делать классы, которые предполагается вот так использовать в if, копируемыми, и писать: C>
C>if (Resource r = Resource(хрр, брр))
C>
C>Хороший оптимизатор это копирование выоптимизирует, а плохому можно помочь идиомой pimpl.
Описан в двух указанных мною местах по-разному...
А насчёт "выоптимизирует" — а что, если
СЕМАНТИКА копирования
в моём классе КОРЕННЫМ ОБРАЗОМ ОТЛИЧАЕТСЯ
от семантики КОНСТРУИРОВАНИЯ ?
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
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
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
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Ты можешь привести конкретный пример, где тебе существенно создание ПК>дополнительного временного объекта в подобном случае?
Конкретный пример у меня дома...
Но ведь СОЗДАНИЕ ДОПОЛНИТЕЛЬНОГО — это же очевидно — ИЗЛИШНЕ!
ПК>И почему этот случай нельзя "разрулить" таким образом? ПК>
S>> Можно "разрулить" — НО
S>> 1. "m" ОСТАЁТСЯ в scope после "if" S>> 2. ВАЖНО — "m" в Вашем примере "m" НЕ УНИЧТОЖИТСЯ в конце "if"
ПК>Я специально окружил предлагаемую замену фигурными скобками. Единственное ПК>место, где будет разница -- if ... else ...
Здравствуйте, SergeCpp, Вы писали:
SC>А насчёт "выоптимизирует" — а что, если SC>СЕМАНТИКА копирования SC>в моём классе КОРЕННЫМ ОБРАЗОМ ОТЛИЧАЕТСЯ SC>от семантики КОНСТРУИРОВАНИЯ ?
Здравствуйте, Centaur, Вы писали:
C>Здравствуйте, SergeCpp, Вы писали:
SC>>А насчёт "выоптимизирует" — а что, если SC>>СЕМАНТИКА копирования SC>>в моём классе КОРЕННЫМ ОБРАЗОМ ОТЛИЧАЕТСЯ SC>>от семантики КОНСТРУИРОВАНИЯ ?
C>Очень плохо. Я умываю руки.
Ну а если этот класс — база данных ?
КОПИРОВАТЬ её я не хочу...
Хоть это и несколько указателей
(а со ссылками — ТЕМ БОЛЕЕ не очень)...
Здравствуйте, SergeCpp, Вы писали:
SC>Здравствуйте, Centaur, Вы писали:
C>>Здравствуйте, SergeCpp, Вы писали:
SC>>>А насчёт "выоптимизирует" — а что, если SC>>>СЕМАНТИКА копирования SC>>>в моём классе КОРЕННЫМ ОБРАЗОМ ОТЛИЧАЕТСЯ SC>>>от семантики КОНСТРУИРОВАНИЯ ?
C>>Очень плохо. Я умываю руки.
SC>Ну а если этот класс — база данных ?
SC>КОПИРОВАТЬ её я не хочу...
Если это действительно база данных, то есть большая коллекция объектов, то конструировать её посреди программы ты тоже не хочешь.
SC>Хоть это и несколько указателей SC>(а со ссылками — ТЕМ БОЛЕЕ не очень)...
А если это абстракция подключения к базе данных — то его вполне можно сделать копируемым или, скажем, перемещаемым (как std::auto_ptr). Что до ссылок, то их можно заменить указателями без большого труда.
...
SC>>Ну а если этот класс — база данных ?
SC>>КОПИРОВАТЬ её я не хочу...
C>Если это действительно база данных, то есть большая коллекция объектов, то конструировать её посреди программы ты тоже не хочешь.
А кто сказал, что ПОСРЕДИ ?
SC>>Хоть это и несколько указателей SC>>(а со ссылками — ТЕМ БОЛЕЕ не очень)...
C>А если это абстракция подключения к базе данных — то его вполне можно сделать копируемым или, скажем, перемещаемым (как std::auto_ptr). Что до ссылок, то их можно заменить указателями без большого труда.
...вполне можно... // некрасиво...
...без большого труда... // а МАЛЕНЬКИЙ труд тоже не нужен...
Здравствуйте, Lorenzo_LAMAS, Вы писали:
S>>Offtopic: S>>Кстати. У меня последний стандарт от 1998 года. Есть более свежий? Если да, то где взять?
L_L>Такие вопросы не приветствуются L_L>давай мыло
Здравствуйте, SergeCpp, Вы писали:
SC>Здравствуйте, Centaur, Вы писали:
SC>>>Ну а если этот класс — база данных ?
SC>>>КОПИРОВАТЬ её я не хочу...
C>>Если это действительно база данных, то есть большая коллекция объектов, то конструировать её посреди программы ты тоже не хочешь.
SC>А кто сказал, что ПОСРЕДИ ?
А если бы он рождался в начале программы и жил бы всё время её выполнения, то там бы был не if, а исключение бы бросалось. А if говорит мне о том, что объект короткоживущий, легко конструируемый, и не особо важный для функционирования программы.
Здравствуйте, 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…
Переписка с 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.
Здравствуйте, SergeCpp, Вы писали:
SC>Здравствуйте!
SC>Переписка с Bjarne Stroustrup SC>-----------------------------
SC>Смирнов Сергей wrote:
>>Good day, Dr. Stroustrup!