Инициализация int
От: igna Россия  
Дата: 01.10.09 08:00
Оценка: :))) :)))
Как вы инициализируете int:

    int i = 0;


или

    int i(0);


?
Re: Инициализация int
От: Bell Россия  
Дата: 01.10.09 08:10
Оценка: +1 :)
Здравствуйте, igna, Вы писали:

Использую первый вариант.

ЗЫ
А может сразу в голосование?
Любите книгу — источник знаний (с) М.Горький
Re[2]: Инициализация int
От: Вумудщзук Беларусь  
Дата: 01.10.09 12:27
Оценка: +1 :)
>А может сразу в голосование?
чего уж там, может, сразу в СВ?..
тчк
Re[2]: Инициализация std::complex
От: igna Россия  
Дата: 01.10.09 13:28
Оценка:
Здравствуйте, Bell, Вы писали:

B>Использую первый вариант.


А для std::complex?

    std::complex x = x0;


или

    std::complex x(x0);


?
Re[3]: Инициализация std::complex
От: Eugene Sh Россия  
Дата: 01.10.09 16:56
Оценка: +1
Здравствуйте, igna, Вы писали:

I>А для std::complex?


I>
I>    std::complex x = x0;
I>


I>или


I>
I>    std::complex x(x0);
I>



Первый вариант выглядит лучше. А с точки зрения быстродействия разницы нет — в обоих случаях вызовется конструктор копирования.
Re[4]: Инициализация std::complex
От: igna Россия  
Дата: 02.10.09 06:12
Оценка:
Здравствуйте, Eugene Sh, Вы писали:

ES>Первый вариант выглядит лучше. А с точки зрения быстродействия разницы нет — в обоих случаях вызовется конструктор копирования.


Prefer using the form "T t(u);" instead of "T t = u;" where possible. The former usually works wherever the latter works, and has other advantages—for example, it can take multiple parameters.

(Herb Sutter, Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions, Item 42)


Ты с этим не согласен или считаешь инициализацию std::complex особым случаем? Почему?
Re[5]: Инициализация std::complex
От: Bell Россия  
Дата: 02.10.09 06:52
Оценка: +1
Здравствуйте, igna, Вы писали:

ES>>Первый вариант выглядит лучше. А с точки зрения быстродействия разницы нет — в обоих случаях вызовется конструктор копирования.


I>

I>Prefer using the form "T t(u);" instead of "T t = u;" where possible. The former usually works wherever the latter works, and has other advantages—for example, it can take multiple parameters.

I>(Herb Sutter, Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions, Item 42)


I>Ты с этим не согласен или считаешь инициализацию std::complex особым случаем? Почему?


Я, к примеру, не имею ничего против записи "T t(u);", но вариант с "=" лично мне более привычен. А упомянутое преимущество "может принимать несколько параметров" ИМХО несколько надумано — никто не мешает записать "T t = T(u1, u2)" Понятно, что разница между инициализацией копированием и прямой инициализацией есть, но в абсолютном большинстве случаев это совершенно несущественно.
Любите книгу — источник знаний (с) М.Горький
Re[6]: Инициализация std::complex
От: igna Россия  
Дата: 02.10.09 07:11
Оценка:
Здравствуйте, Bell, Вы писали:

B>Я, к примеру, не имею ничего против записи "T t(u);", но вариант с "=" лично мне более привычен.


Это относится и к std::complex? И к boost::shared_ptr? И к std::string? В том числе к std::string::string(const char*)? Может ты вообще всегда по-возможности используешь 'вариант с "="'?
Re[7]: Инициализация std::complex
От: Bell Россия  
Дата: 02.10.09 08:36
Оценка:
Здравствуйте, igna, Вы писали:

B>>Я, к примеру, не имею ничего против записи "T t(u);", но вариант с "=" лично мне более привычен.


I>Это относится и к std::complex? И к boost::shared_ptr? И к std::string? В том числе к std::string::string(const char*)? Может ты вообще всегда по-возможности используешь 'вариант с "="'?


Если у меня не возникает ощущения дискомфорта, то я использую вариант с "=".
При работе с shared_ptr, например, использую вариант со скобочками, со строками — тоже. Класс complex использовать не приходилось, но первое ощущение — использовал бы вариант с "=".
В общем для меня это в большей степени субъективный выбор.
Ну а если есть подозрения на проблемы с эффективностью — так на это есть профайлер.
Любите книгу — источник знаний (с) М.Горький
Re[7]: Инициализация std::complex
От: blackhearted Украина  
Дата: 02.10.09 08:45
Оценка:
Здравствуйте, igna, Вы писали:

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


B>>Я, к примеру, не имею ничего против записи "T t(u);", но вариант с "=" лично мне более привычен.


I>Это относится и к std::complex? И к boost::shared_ptr? И к std::string? В том числе к std::string::string(const char*)? Может ты вообще всегда по-возможности используешь 'вариант с "="'?


Со std::string самое интересное различие выходит
Re[8]: Инициализация std::complex
От: igna Россия  
Дата: 02.10.09 08:51
Оценка:
Здравствуйте, Bell, Вы писали:

B>Если у меня не возникает ощущения дискомфорта, то я использую вариант с "=".

B>При работе с shared_ptr, например, использую вариант со скобочками, со строками — тоже. Класс complex использовать не приходилось, но первое ощущение — использовал бы вариант с "=".
B>В общем для меня это в большей степени субъективный выбор.

Твое счастье. Я формалист, мне хотелось бы алгоритм выбора формализовать. Судя по книгам самого Саттера, давшего рекомендацию использовать "T t(u);", он сам не придерживается своей рекомендации буквально, мог бы и рекомендацию эту самую поточнее сформулировать, встроенные типы там исключить, может что-нибудь еще.
Re[8]: Инициализация std::complex
От: igna Россия  
Дата: 02.10.09 08:56
Оценка:
Здравствуйте, blackhearted, Вы писали:

B>Со std::string самое интересное различие выходит


С std::string::string(const string&) или с std::string::string(const char*)?
Re[3]: Инициализация int
От: igna Россия  
Дата: 02.10.09 09:01
Оценка:
Здравствуйте, Вумудщзук, Вы писали:

В>чего уж там, может, сразу в СВ?..


Там не только C++.
Re[7]: Инициализация std::complex
От: Alexander G Украина  
Дата: 02.10.09 09:12
Оценка: 3 (1)
Здравствуйте, igna, Вы писали:

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


B>>Я, к примеру, не имею ничего против записи "T t(u);", но вариант с "=" лично мне более привычен.


I>Это относится и к std::complex? И к boost::shared_ptr? И к std::string? В том числе к std::string::string(const char*)? Может ты вообще всегда по-возможности используешь 'вариант с "="'?


У shared_ptr я писал = везде, где можно, и часть кода сломалось, когда конструктор, принимающий auto_ptr внезапно стал explicit в 1.39.
С другой стороны, теперь конструирование shared_ptr через = можно использовать, чтобы подчеркнуть именно общее владение, а не передачу владения.
Русский военный корабль идёт ко дну!
Re[9]: Инициализация std::complex
От: Bell Россия  
Дата: 02.10.09 09:33
Оценка:
Здравствуйте, igna, Вы писали:

B>>Если у меня не возникает ощущения дискомфорта, то я использую вариант с "=".

B>>При работе с shared_ptr, например, использую вариант со скобочками, со строками — тоже. Класс complex использовать не приходилось, но первое ощущение — использовал бы вариант с "=".
B>>В общем для меня это в большей степени субъективный выбор.

I>Твое счастье.

Фууух, пронесло

I>Я формалист, мне хотелось бы алгоритм выбора формализовать. Судя по книгам самого Саттера, давшего рекомендацию использовать "T t(u);", он сам не придерживается своей рекомендации буквально, мог бы и рекомендацию эту самую поточнее сформулировать, встроенные типы там исключить, может что-нибудь еще.


Ну, может быть что-то вроде этого: если Вы боитесь создания лишнего временного объекта — используйте вариант со скобками.
Любите книгу — источник знаний (с) М.Горький
Re[10]: Инициализация std::complex
От: igna Россия  
Дата: 02.10.09 09:56
Оценка:
Здравствуйте, Bell, Вы писали:

B>Ну, может быть что-то вроде этого: если Вы боитесь создания лишнего временного объекта — используйте вариант со скобками.


Может. А может еще проще, "используйте вариант со скобками" и все. Например:

int sum(int const a[], std::size_t const a_length)
{
    int sum(0);
    int const* const a_end(a + a_length);
    for (int const* p(a); p < a_end; ++p)
        sum += *p;
    return sum;
}
Re: Инициализация int
От: Николай Ивченков  
Дата: 02.10.09 11:07
Оценка: 5 (1)
Всюду, где возможно, я предпочитаю запись вида T x = y; — т.е. copy-initialization. Тем самым показывается использование неявного преобразования y к T, а значит, и родство между x и y — а именно: сущность y может быть использована там, где ожидается сущность типа T.
Re[3]: Инициализация int
От: Roman Odaisky Украина  
Дата: 02.10.09 11:33
Оценка: :)
Здравствуйте, Вумудщзук, Вы писали:

>>А может сразу в голосование? :)

В>чего уж там, может, сразу в СВ?..

Даешь int i((int()))!
До последнего не верил в пирамиду Лебедева.
Re[2]: Инициализация int
От: igna Россия  
Дата: 02.10.09 12:45
Оценка:
Здравствуйте, Николай Ивченков, Вы писали:

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


С мнением Саттера ты конечно знаком:

Prefer using the form "T t(u);" instead of "T t = u;" where possible. The former usually works wherever the latter works, and has other advantages—for example, it can take multiple parameters.

(Herb Sutter, Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions, Item 42)


Просто на всякий случай.
Re[9]: Инициализация std::complex
От: blackhearted Украина  
Дата: 02.10.09 17:03
Оценка:
Здравствуйте, igna, Вы писали:

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


B>>Со std::string самое интересное различие выходит


I>С std::string::string(const string&) или с std::string::string(const char*)?


с (const char*)
Re[3]: Инициализация int
От: Lorenzo_LAMAS  
Дата: 02.10.09 18:26
Оценка: +1
I>С мнением Саттера ты конечно знаком:

И что теперь, молиться на это мнение?
Of course, the code must be complete enough to compile and link.
Re[4]: Инициализация int
От: igna Россия  
Дата: 02.10.09 19:06
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>И что теперь, молиться на это мнение?


Наоборот.
Re[3]: Инициализация int
От: Николай Ивченков  
Дата: 02.10.09 19:16
Оценка:
igna:

I>С мнением Саттера ты конечно знаком


Я с этим его мнением не согласен. Кстати, у Саттера допущена грубая неточность.

If u is of some other type, then this has the meaning "T t( T(u) );"—that is, u is first converted to a temporary T object, and then t is copy-constructed from that.

В direct-initialization кандидатами являются все конструкторы, а не только copy constructor. Причём в инициализации, где cv-unqualified тип инициализирующего выражения совпадает с cv-unqualified типом инициализируемого объекта, при разрешении перегрузки предпочтение может быть отдано некопирующему конструктору:

#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;

? Из стандарта следует, что эффект должен быть такой же. VC++ 8.0 с /Za, GNU C++ 4.1.2 и Comeau online нарушают требования стандарта, причём каждый по-своему. Все три компилятора выдают ошибку при попытке скомпилировать вышеуказанный пример с заменой на copy-initialization, и, кроме того,

VC++ с /Za выдаёт ошибку при попытке скомпилировать

struct X;

struct A
{
    operator X const &() const;
};

struct X
{
    X(X &);
    template <class T>
        X(T const &);
};

int f(X);

int main()
{
    sizeof f(A());
}

— видимо, в direct-initialization, являющейся частью copy-initialization, он считает допустимыми кандидатами только копирующие конструкторы;

GNU C++ выдаёт ошибку при попытке скомпилировать

struct X;

struct A
{
    operator X &() const;
};

struct X
{
    X(X &);
private:
    template <class T>
        X(T const &);
};

int f(X);

int main()
{
    sizeof f(A());
}

— это вообще странный глюк.

P.S. Ну, и если совсем уж придираться к тому, что написано у Саттера, то можно заметить, что T t( T(u) ); может быть объявлением функции в рамках его соглашений об u.
Re[4]: Инициализация int
От: Николай Ивченков  
Дата: 02.10.09 20:16
Оценка: 30 (1)
НИ>Из стандарта следует, что эффект должен быть такой же.

Отмечу, что здесь учитывается тот факт, что конструктор X(X const *) — неявный. В общем же случае можно получить разные результаты в полном соответствии со стандартом:

#include <iostream>

struct X
{
    explicit X(int)
        { std::cout << "X(int)" << std::endl; }
    X(long)
        { std::cout << "X(long)" << std::endl; }
};

int main()
{
    X x1 = 0;
    X x2(X(0));
}
Re[4]: Инициализация int
От: igna Россия  
Дата: 03.10.09 08:55
Оценка:
Здравствуйте, Николай Ивченков, Вы писали:

НИ>P.S. Ну, и если совсем уж придираться к тому, что написано у Саттера, то можно заметить, что T t( T(u) ); может быть объявлением функции в рамках его соглашений об u.


Это как?
Re: Инициализация int
От: wander  
Дата: 03.10.09 08:59
Оценка:
Здравствуйте, igna, Вы писали:

I>Как вы инициализируете int:


I>
I>    int i = 0;
I>


I>или


I>
I>    int i(0);
I>


I>?



    int i = int(); // о как!

Re[2]: Инициализация int
От: igna Россия  
Дата: 03.10.09 09:07
Оценка:
Здравствуйте, wander, Вы писали:

W>    int i = int(); // о как!


А если нужно инициализировать значением отличным от нуля?
Re[3]: Инициализация int
От: wander  
Дата: 03.10.09 09:12
Оценка:
Здравствуйте, igna, Вы писали:

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


I>
W>>    int i = int(); // о как!
I>


I>А если нужно инициализировать значением отличным от нуля?


В условии увидел только нули, отсюда и вариант
А вообще первый вариант, да.
Re[5]: Инициализация int
От: rg45 СССР  
Дата: 03.10.09 09:47
Оценка:
Здравствуйте, igna, Вы писали:

I>Здравствуйте, Николай Ивченков, Вы писали:


НИ>>P.S. Ну, и если совсем уж придираться к тому, что написано у Саттера, то можно заметить, что T t( T(u) ); может быть объявлением функции в рамках его соглашений об u.


I>Это как?


Например так:
typedef int T;
typedef int u;

T t(T(u));

T (*pointer_to_function)(T f(u)) = &t;
--
Справедливость выше закона. А человечность выше справедливости.
Re[5]: Инициализация int
От: Николай Ивченков  
Дата: 03.10.09 09:56
Оценка: 9 (2) +1
igna:

НИ>>P.S. Ну, и если совсем уж придираться к тому, что написано у Саттера, то можно заметить, что T t( T(u) ); может быть объявлением функции в рамках его соглашений об u.


I>Это как?


Например, так:

#include <iostream>

typedef int T;
bool u;

int main()
{
    T t( T(u) ); // эквивалентно T t(T u); или просто T t(T);
    std::cout << sizeof t(0) << std::endl;
}
Re[6]: Инициализация int
От: Николай Ивченков  
Дата: 03.10.09 10:01
Оценка:
rg45:

R>Например так:

R>
R>typedef int T;
R>typedef int u;

R>T t(T(u));

R>T (*pointer_to_function)(T f(u)) = &t;
R>


Про u там всё же было сказано "Assuming u is not the name of a type".
Re[6]: Инициализация int
От: rg45 СССР  
Дата: 03.10.09 10:34
Оценка: :)
Здравствуйте, Николай Ивченков, Вы писали:

НИ>
НИ>T t( T(u) ); // эквивалентно T t(T u); или просто T t(T);
НИ>


Забавно. Можно ребусы придумывать.
--
Справедливость выше закона. А человечность выше справедливости.
Re: Инициализация int
От: fay Украина www.bekhter.net
Дата: 03.10.09 19:48
Оценка:
Здравствуйте, igna, Вы писали:

I>Как вы инициализируете int:


I>
I>    int i = 0;
I>


I>или


I>
I>    int i(0);
I>


Предпочитаю первый... Такая ошибка может обернуть веселыми минутами...

int i(10);
int i[10];
Best regards,
Oleg Bekhter
Software Developer
Re[4]: Инициализация int
От: igna Россия  
Дата: 04.10.09 04:55
Оценка:
Здравствуйте, wander, Вы писали:

W>В условии увидел только нули, отсюда и вариант

W>А вообще первый вариант, да.

Но если инициализация нулем, то все же int i = int();?
Re[5]: Инициализация int
От: wander  
Дата: 04.10.09 12:20
Оценка: +1
Здравствуйте, igna, Вы писали:

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


W>>В условии увидел только нули, отсюда и вариант

W>>А вообще первый вариант, да.

I>Но если инициализация нулем, то все же int i = int();?


Вообще конечно зависит от ситуации. Я бы запись T i = T() применил бы в обобщенных функциях для инициализации значением по умолчанию. В случае int это будет ноль. В целом я больше склоняюсь к записи с '=' везде, где это целесообразно, лично для меня читаемость такого кода:
    std::string str = "string";

намного выше, чем:
    std::string str("string");

Как тут уже говорили, первая запись подчеркивает родство сущностей.

ЗЫ. А можно ответный вопрос. Это что, у тебя там спор какой-то с кем-то по этому поводу? Как-то не смахивает это на глобальную проблему человечества...
Re[7]: Инициализация std::complex
От: Erop Россия  
Дата: 04.10.09 18:59
Оценка: 1 (1)
Здравствуйте, igna, Вы писали:

I>Это относится и к std::complex? И к boost::shared_ptr? И к std::string? В том числе к std::string::string(const char*)? Может ты вообще всегда по-возможности используешь 'вариант с "="'?


Я придерживаюсь простого формального правила: объекты с семантикой значения инициализирую через =, а объекты такой семантики лишённые через ()...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[10]: Инициализация std::complex
От: Erop Россия  
Дата: 04.10.09 19:00
Оценка:
Здравствуйте, Bell, Вы писали:

B>Ну, может быть что-то вроде этого: если Вы боитесь создания лишнего временного объекта — используйте вариант со скобками.


Зачем этого бояться? Сначала нужно найти компилятор, который таки создаёт такой временный объект
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: Инициализация std::complex
От: igna Россия  
Дата: 05.10.09 04:33
Оценка:
Здравствуйте, Erop, Вы писали:

E>Я придерживаюсь простого формального правила: объекты с семантикой значения инициализирую через =, а объекты такой семантики лишённые через ()...


Еще одно мнение и опять не совпадающее с мнением Саттера. Странно, что в одной из must read книг по C++ дается совет, с которым похоже мало кто согласен, но признание в несогласии приходится вытягивать клещами.
Re[6]: Инициализация int
От: igna Россия  
Дата: 05.10.09 04:40
Оценка:
Здравствуйте, wander, Вы писали:

W>ЗЫ. А можно ответный вопрос. Это что, у тебя там спор какой-то с кем-то по этому поводу?


Нет.

А можно все же ответ на мой вопрос? В необобщенном случае ты действительно напишешь int i = int();, вместо int i = 0;? Если нет, к чему был твой первый ответ?
Re[8]: Инициализация std::complex
От: igna Россия  
Дата: 05.10.09 07:23
Оценка:
Здравствуйте, Erop, Вы писали:

E>Я придерживаюсь простого формального правила: объекты с семантикой значения инициализирую через =, а объекты такой семантики лишённые через ()...


Согласно этому правилу std:auto_ptr и boost::shared_ptr нужно инициализировать по разному. Я правильно понял?
Re[9]: Инициализация std::complex
От: Erop Россия  
Дата: 05.10.09 08:29
Оценка:
Здравствуйте, igna, Вы писали:

I>Согласно этому правилу std:auto_ptr и boost::shared_ptr нужно инициализировать по разному. Я правильно понял?


Да, и это хорошо, так как подчёркивает отсутствие семантики значения у std:auto_ptr...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Инициализация int
От: igna Россия  
Дата: 05.10.09 08:47
Оценка:
Здравствуйте, fay, Вы писали:

fay>Предпочитаю первый... Такая ошибка может обернуть веселыми минутами...


fay>int i(10);
fay>int i[10];


Честно говоря не вижу проблемы. Наверное можно сконструировать какой-нибудь (скорее искуственный) пример, но в большинстве случаев компилятор выдаст сообщение об ошибке когда попытаешься использовать целое вместо массива целых или наоборот.
Re[10]: Инициализация std::complex
От: igna Россия  
Дата: 05.10.09 08:54
Оценка:
Здравствуйте, Erop, Вы писали:

E>Да, и это хорошо, так как подчёркивает отсутствие семантики значения у std:auto_ptr...


Угу, а формальное определение семантики значения у тебя есть?
Re[11]: Инициализация std::complex
От: Erop Россия  
Дата: 05.10.09 09:35
Оценка:
Здравствуйте, igna, Вы писали:

I>Угу, а формальное определение семантики значения у тебя есть?

Копируемый, присваеваемый объект, который представляет сам себя и все копии которого эквивалентны.

А зачем это всё тебе надо? Code-style разрабатываешь?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[12]: Инициализация std::complex
От: igna Россия  
Дата: 05.10.09 09:42
Оценка:
Здравствуйте, Erop, Вы писали:

E>Копируемый, присваеваемый объект, который представляет сам себя и все копии которого эквивалентны.


Тогда согласно твоему правилу константы нужно инициализировать используя скобки:

    int const n(123);


E>А зачем это всё тебе надо? Code-style разрабатываешь?


В некотором смысле. Для себя.
Re[13]: Инициализация std::complex
От: Erop Россия  
Дата: 05.10.09 10:59
Оценка:
Здравствуйте, igna, Вы писали:

I>Тогда согласно твоему правилу константы нужно инициализировать используя скобки:

Нет, не надо. семантика значения не зависит от константности. Значение -- это число, строка, прямоугольник. Не значение -- это открытый файл, например.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[7]: Инициализация int
От: wander  
Дата: 05.10.09 12:02
Оценка:
Здравствуйте, igna, Вы писали:

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


W>>ЗЫ. А можно ответный вопрос. Это что, у тебя там спор какой-то с кем-то по этому поводу?


I>Нет.


I>А можно все же ответ на мой вопрос? В необобщенном случае ты действительно напишешь int i = int();, вместо int i = 0;? Если нет, к чему был твой первый ответ?


Дык я вроде бы ответил уже. Вообще первый раз была шутка, думал поймешь. В необобщенном случае я так не напишу.
Re[14]: Инициализация std::complex
От: igna Россия  
Дата: 05.10.09 13:07
Оценка:
Здравствуйте, Erop, Вы писали:

E>Нет, не надо. семантика значения не зависит от константности.


Понимаю, просто обращаю внимание на недостаток твоего определения. Оно требует присваиваемости, а это не позволяет считать, что int const имеет семантику значения. Или "присваемый" означает у тебя не то же самое что "Assingable" в стандарте?
Re[8]: Инициализация int
От: igna Россия  
Дата: 05.10.09 13:10
Оценка:
Здравствуйте, wander, Вы писали:

W>Дык я вроде бы ответил уже. Вообще первый раз была шутка, думал поймешь.


Спасибо, теперь понятно. Ха-ха-ха. А я уж подумал, может ты выпендренулся.
Re[15]: Инициализация std::complex
От: Erop Россия  
Дата: 05.10.09 18:16
Оценка:
Здравствуйте, igna, Вы писали:

I> Или "присваемый" означает у тебя не то же самое что "Assingable" в стандарте?


Да. Так же, как и копируемый...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Инициализация int
От: fay Украина www.bekhter.net
Дата: 05.10.09 19:15
Оценка:
Здравствуйте, igna, Вы писали:

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


fay>>Предпочитаю первый... Такая ошибка может обернуть веселыми минутами...


I>
fay>>int i(10);
fay>>int i[10];
I>


I>Честно говоря не вижу проблемы. Наверное можно сконструировать какой-нибудь (скорее искуственный) пример, но в большинстве случаев компилятор выдаст сообщение об ошибке когда попытаешься использовать целое вместо массива целых или наоборот.


При портировании с С — легко:
void test ( void *a );
int i1(10);
int i2[10];

test(&i1);
test(&i2);


W4 на MSVC молчит
Best regards,
Oleg Bekhter
Software Developer
Re[4]: Инициализация int
От: nik0lay Россия  
Дата: 05.10.09 21:36
Оценка: +1
int i = 0;
экономя микросекунды на понимание кода читателями моей программы
Все имена функций и классов изменены, любое совпадение является случайным.
Re[5]: Инициализация int
От: igna Россия  
Дата: 06.10.09 06:16
Оценка:
Здравствуйте, nik0lay, Вы писали:

N>int i = 0;

N>экономя микросекунды на понимание кода читателями моей программы

Так. А std::complex, std::auto_ptr, boost::shared_ptr, std::string?
Re[16]: Инициализация std::complex
От: igna Россия  
Дата: 06.10.09 08:25
Оценка:
Здравствуйте, Erop, Вы писали:


I>> Или "присваемый" означает у тебя не то же самое что "Assingable" в стандарте?


E>Да. Так же, как и копируемый...


Прошу прощения, кратких ответов на отрицательные вопросы не понимаю. Ответ "нет" можно понимать как угодно, ответ "да" похоже и вовсе не имеет смысла. Поэтому переформулирую и прошу ответить еще раз:

"Присваемый" означает у тебя то же самое что "Assignable" в стандарте?
Re[17]: Инициализация std::complex
От: Erop Россия  
Дата: 06.10.09 14:37
Оценка:
Здравствуйте, igna, Вы писали:

I>"Присваемый" означает у тебя то же самое что "Assignable" в стандарте?


да
И "копируемый" тоже обозначает аналогичное свойство из стандарта.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[18]: Инициализация std::complex
От: igna Россия  
Дата: 06.10.09 15:07
Оценка:
Здравствуйте, Erop, Вы писали:

I>>"Присваемый" означает у тебя то же самое что "Assignable" в стандарте?


E>да


const type не является Assignable, соответственно не имеет семантики значения. Читаем твое правило:

E>Я придерживаюсь простого формального правила: объекты с семантикой значения инициализирую через =, а объекты такой семантики лишённые через ()...


и инициализируем в соответствии с ним целую константу:

   int const n(123);
Re[19]: Надоел.
От: Erop Россия  
Дата: 06.10.09 16:10
Оценка: :)
Здравствуйте, igna, Вы писали:

I>const type не является Assignable, соответственно не имеет семантики значения. Читаем твое правило:

А что, std::vector<const int> уже запрещён?..

I>и инициализируем в соответствии с ним целую константу:

I>
I>   int const n(123);
I>


Иди лесом. Я тебе уже писал, что const переменной на свойство типа иметь семантику значения не влияет. Просто это константное значение такого типа. Если тебе охота поупорожняться в цереброфилии, то общайся сам с собой...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: Инициализация int
От: fay Украина www.bekhter.net
Дата: 06.10.09 18:41
Оценка:
Здравствуйте, igna, Вы писали:

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


N>>int i = 0;

N>>экономя микросекунды на понимание кода читателями моей программы

I>Так. А std::complex, std::auto_ptr, boost::shared_ptr, std::string?

Ну тут понятно
std::complex<double> clVar( 3.0, -1.0 );
std::auto_ptr<MyStock> pStock( new MyStock( 12, 15, L"Выдача" ) );
boost::shared_array<wchar_t>( new wchar_t[MaxFileLen] );


А вот с std::wstring, честно, как попало. Даже не задумывался об этом.
Специально глянул в исходники — как пальцы стали, так и написал
std::wstring strSQL( L"select IDW,WNAME "
                     L"from WAREHOUSE "
                     L"where OWNER=[:owner]" );
std::wstring strOwner;
if( bla...bla )
   strOwner = L"admin";
else
   strOwner = L"user";
Best regards,
Oleg Bekhter
Software Developer
Re[20]: Не Eropy
От: igna Россия  
Дата: 07.10.09 05:33
Оценка:
Не Eropy

E>const переменной на свойство типа иметь семантику значения не влияет. Просто это константное значение такого типа.


Демагогия.

const в объявлении относится к типу, это часть типа, то есть в объявлении int const n, n это переменная типа int const, а не "константное значение" типа int, как пишет Erop.
Re[7]: Инициализация int
От: igna Россия  
Дата: 07.10.09 05:42
Оценка:
Здравствуйте, fay, Вы писали:

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


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

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

    std::complex<double> x = y;


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

fay>Специально глянул в исходники — как пальцы стали, так и написал
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";


Во-первых, как попало IMHO — плохо.
Во-вторых, никакой как-попалы я у тебя не заметил, инициализация strSQL использует скобки, strOwner не инициализируется.
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...
Пока на собственное сообщение не было ответов, его можно удалить.