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 нужно инициализировать по разному. Я правильно понял?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.