Re[20]: Да Erop, std::vector<const int> запрещён!
От: igna Россия  
Дата: 07.10.09 06:37
Оценка: 1 (1)
E>А что, std::vector<const int> уже запрещён?..

Да, запрещен.

Попробуй на Comeau нижеприведенный код:

#include <vector>
using namespace std;

vector<const int> v;
Re[21]: Не Eropy
От: Erop Россия  
Дата: 07.10.09 10:03
Оценка:
Здравствуйте, igna, Вы писали:

I>const в объявлении относится к типу, это часть типа, то есть в объявлении int const n, n это переменная типа int const, а не "константное значение" типа int, как пишет Erop.


Если тебе надо понять, то ты поймёшь, IMHO. А если тебе надо поспорить...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[21]: Да Erop, std::vector<const int> запрещён!
От: Erop Россия  
Дата: 07.10.09 10:04
Оценка:
Здравствуйте, igna, Вы писали:

I>Да, запрещен.

Прикольно. Я пользовался как-то и не задумывался, что это не хорошо.
Интересно, зачем его запретили?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[22]: Не Eropy
От: igna Россия  
Дата: 07.10.09 10:13
Оценка:
Здравствуйте, Erop, Вы писали:

E>Если тебе надо понять, то ты поймёшь, IMHO. А если тебе надо поспорить...


Понять-то, я понял сразу, но потом спросил, нет ли у тебя формального определения. А формальное определение это как раз тот случай, где придирки к мелочам оправданы.
Re[22]: Да Erop, std::vector<const int> запрещён!
От: igna Россия  
Дата: 07.10.09 10:36
Оценка: +1
Здравствуйте, Erop, Вы писали:

E>Интересно, зачем его запретили?


IMHO, в стандарте так получилось, никаких глубокомысленных причин запрета нет. Заодно, кстати, запретили std::set<const int>, что уж и вовсе неумно.
Re[23]: Да Erop, std::vector<const int> запрещён!
От: Erop Россия  
Дата: 07.10.09 14:08
Оценка:
Здравствуйте, igna, Вы писали:

I>IMHO, в стандарте так получилось, никаких глубокомысленных причин запрета нет. Заодно, кстати, запретили std::set<const int>, что уж и вовсе неумно.


Спасибо, не знал, что маразм окрепчал настолько.
Ну я тогда, значит не стандартным понятием "присваемваемый" пользуюсь. Типа на константность и волатильность самого объекта не смотрю.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[23]: Не Eropy
От: Erop Россия  
Дата: 07.10.09 14:12
Оценка:
Здравствуйте, igna, Вы писали:

I>Понять-то, я понял сразу, но потом спросил, нет ли у тебя формального определения. А формальное определение это как раз тот случай, где придирки к мелочам оправданы.


1) Придирки -- это скучно
2) Они не способствуют конструктивному духу дискуссии
3) Критикуешь -- предлагай, тем более, если ты понял
4) Я же тебе уже несколько раз написал, что константность переменной не учитываем. ТИпа так же как foo( int ) и foo( const int ) -- это одно и то же...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: Инициализация int
От: fay Украина www.bekhter.net
Дата: 07.10.09 18:57
Оценка:
Здравствуйте, igna, Вы писали:

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


I>
fay>>std::complex<double> clVar( 3.0, -1.0 );
I>


I>А если выбор есть?:


I>
I>    std::complex<double> x(y);
I>

I>
I>    std::complex<double> x = y;
I>


Хм, верооятно так:
std::complex<double> x( 3.0, -1.0 );

но
std::complex<double> x = y;


fay>>А вот с std::wstring, честно, как попало. Даже не задумывался об этом.

fay>>Специально глянул в исходники — как пальцы стали, так и написал
I>
fay>>std::wstring strSQL( L"select IDW,WNAME "
fay>>                     L"from WAREHOUSE "
fay>>                     L"where OWNER=[:owner]" );
fay>>std::wstring strOwner;
fay>>if( bla...bla )
fay>>   strOwner = L"admin";
fay>>else
fay>>   strOwner = L"user";
I>


I>Во-первых, как попало IMHO — плохо.

I>Во-вторых, никакой как-попалы я у тебя не заметил, инициализация strSQL использует скобки, strOwner не инициализируется.

Почему, можно было бы как-то так:
std::wstring strOwner( ((bal..bla) ? L"admin" : L"user") );


Но мне эта запись глаза режет.
Best regards,
Oleg Bekhter
Software Developer
Re[9]: Инициализация int
От: igna Россия  
Дата: 07.10.09 19:45
Оценка:
Здравствуйте, fay, Вы писали:

fay>std::wstring strOwner( ((bal..bla) ? L"admin" : L"user") );


fay>Но мне эта запись глаза режет.


А эта:?

std::wstring strOwner = (bal..bla) ? L"admin" : L"user";
Re[24]: Не Eropy
От: igna Россия  
Дата: 08.10.09 07:36
Оценка:
Здравствуйте, Erop, Вы писали:

E>foo( int ) и foo( const int ) -- это одно и то же...


В объявлении — да, в определении — нет.

Возвращаясь к твоему "простому формальному правилу" (объекты с семантикой значения инициализировать через =, а объекты такой семантики лишённые через ()), хочу спросить, верно ли я понял, что std::string следует инициализировать "через =" даже если это инициализация не другим std::string, а <творительный падеж>char const*</творительный падеж>?:

    string s = "abcd";

void f(char const* p)
{
    string s = p;
}
Re[25]: Не Eropy
От: Erop Россия  
Дата: 08.10.09 10:26
Оценка:
Здравствуйте, igna, Вы писали:

I>Возвращаясь к твоему "простому формальному правилу" (объекты с семантикой значения инициализировать через =, а объекты такой семантики лишённые через ()), хочу спросить, верно ли я понял, что std::string следует инициализировать "через =" даже если это инициализация не другим std::string, а <творительный падеж>char const*</творительный падеж>?:


I>
I>    string s = "abcd";
I>

I>
I>void f(char const* p)
I>{
I>    string s = p;
I>}
I>


Да, правильно. Если так нельзя, я пишу
string s = string( x, y, z );
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[26]: Не Eropy
От: igna Россия  
Дата: 08.10.09 10:51
Оценка:
Здравствуйте, Erop, Вы писали:

E>Да, правильно. Если так нельзя, я пишу
string s = string( x, y, z );


Что ж не

    string s = string( "abcd" );


для единообразия.
Re[27]: Не Eropy
От: Erop Россия  
Дата: 08.10.09 11:20
Оценка:
Здравствуйте, igna, Вы писали:

I>для единообразия.


Ну я же
double x = double( 5 );
не пишу...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[10]: Инициализация int
От: fay Украина www.bekhter.net
Дата: 08.10.09 18:59
Оценка:
Здравствуйте, igna, Вы писали:

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


I>
fay>>std::wstring strOwner( ((bal..bla) ? L"admin" : L"user") );
I>


fay>>Но мне эта запись глаза режет.


I>А эта:?


I>
I>std::wstring strOwner = (bal..bla) ? L"admin" : L"user";
I>

Так нормально, но для отладки удобен if, и судя по коду оптимизатору с if легче
int main( int argc, char **, char ** ) {
   std::wstring str1;
   if( argc )
      str1 = L"123";   
   else
      str1 = L"456";   

   std::wcout << str1 << std::endl;

   std::wstring str2 = (argc) ? L"678"
                              : L"012";   

   std::wcout << str2 << std::endl;

   return 0;
}



; 231  :    if( argc )
   mov   edi, DWORD PTR _argc$[esp+84]
   mov   DWORD PTR __$EHRec$[esp+96], ebx

; 232  :       str1 = L"123";   
   push  3
   lea   ecx, DWORD PTR _str1$[esp+92]
   cmp   edi, ebx
   je SHORT $LN2@main
   push  OFFSET $SG155640

; 233  :    else
   jmp   SHORT $LN160@main
$LN2@main:

; 234  :       str1 = L"456";   
   push  OFFSET $SG155642
$LN160@main:
   call  ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@PB_WI@Z ; std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::assign


; 237  : 
; 238  :    std::wstring str2 = (argc) ? L"678"
; 239  :                               : L"012";   
   mov   edx, OFFSET $SG155682
   cmp   edi, ebx
   jne   SHORT $LN6@main
   mov   edx, OFFSET $SG155683
$LN6@main:
   xor   eax, eax
   mov   WORD PTR _str2$[esp+92], ax
   mov   eax, edx
   mov   DWORD PTR _str2$[esp+112], 7
   mov   DWORD PTR _str2$[esp+108], ebx
   lea   esi, DWORD PTR [eax+2]
$LL157@main:
   mov   cx, WORD PTR [eax]
   add   eax, 2
   cmp   cx, bx
   jne   SHORT $LL157@main
   sub   eax, esi
   sar   eax, 1
   push  eax
   push  edx
   lea   ecx, DWORD PTR _str2$[esp+96]
   call  ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@PB_WI@Z ; std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::assign
Best regards,
Oleg Bekhter
Software Developer
Re[2]: vector<int> a = 10;
От: igna Россия  
Дата: 14.10.09 10:05
Оценка:
Здравствуйте, Николай Ивченков, Вы писали:

НИ>Всюду, где возможно, я предпочитаю запись вида T x = y; — т.е. copy-initialization. Тем самым показывается использование неявного преобразования y к T, а значит, и родство между x и y — а именно: сущность y может быть использована там, где ожидается сущность типа T.


В том числе так?:

    vector<int> a = 10;
Re[3]: vector<int> a = 10;
От: Николай Ивченков  
Дата: 14.10.09 16:03
Оценка: +2
igna:

НИ>>Всюду, где возможно, я предпочитаю запись вида T x = y; — т.е. copy-initialization. Тем самым показывается использование неявного преобразования y к T, а значит, и родство между x и y — а именно: сущность y может быть использована там, где ожидается сущность типа T.


I>В том числе так?:


I>
    vector<int> a = 10;

Конечно, это мой самый любимый код. Я ведь просто обожаю ill-formed программы, поэтому можешь не сомневаться, что под "где возможно" вовсе не подразумевалось, что программа должна успешно компилироваться.

Я вижу другой (более-менее разумный) вопрос, который тут имело бы смысл задать — это как поступить в случае с преобразующим конструктором, который следовало сделать явным (но таковым его не сделали и менять такое положение дел по каким-то соображениям не хотят)? Вероятно, я бы в этом случае использовал direct-initialization (как если бы конструктор был explicit) — если такая форма инициализации даст нужный эффект.
Re[4]: Инициализация int
От: Николай Ивченков  
Дата: 14.10.09 16:03
Оценка: 2 (1)
Николай Ивченков:

НИ>
#include <iostream>

struct X
{
    X(X const *)
        { std::cout << "X(X const *)" << std::endl; }
    X(X &)
        { std::cout << "X(X &)" << std::endl; }
    operator X const *() const
        { std::cout << "X::operator X const *()"; return this; }
    ~X()
        {}
};

int main()
{
    X x(X(0));
}

НИ>Здесь копирующий конструктор попросту не является viable function, и выбор падает на X(X const *). Что будет, если теперь заменить

НИ>
X x(X(0));

НИ>на

НИ>
X x = 0;

НИ>?

Насчёт этой ситуации удалось кое-что прояснить:

13.3.3.1/4:

However, when considering the argument of a user-defined conversion function that is a candidate by 13.3.1.3 when invoked for the copying of the temporary in the second step of a class copy-initialization, or by 13.3.1.4, 13.3.1.5, or 13.3.1.6 in all cases, only standard conversion sequences and ellipsis conversion sequences are allowed.

Вообще conversion function не может быть кандидатом по 13.3.1.3, но, видимо, там под "conversion function" имелся в виду не термин, определяемый в 12.3.2, а "constructor or conversion function" (где "conversion function" — это уже термин). Зря я раньше не дочитал до конца это предложение
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.