Explicit keyword - зачем?
От: Посторонним В. Беларусь  
Дата: 09.05.06 19:20
Оценка:
Зачем в стандартных классах производных от std::exception конструкторы, имеющие string аргумент, объявлены explicit.
Например std::logic_error
Re: Explicit keyword - зачем?
От: Roman Odaisky Украина  
Дата: 09.05.06 19:30
Оценка:
Здравствуйте, Посторонним В., Вы писали:

ПВ>Зачем в стандартных классах производных от std::exception конструкторы, имеющие string аргумент, объявлены explicit.

ПВ>Например std::logic_error

За шкафом!

std::logic_error("hello world") и std::string("hello world") — одно и то же? Нет? Поэтому и explicit.

RTFM!
До последнего не верил в пирамиду Лебедева.
Re[2]: Explicit keyword - зачем?
От: Посторонним В. Беларусь  
Дата: 09.05.06 20:25
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, Посторонним В., Вы писали:


ПВ>>Зачем в стандартных классах производных от std::exception конструкторы, имеющие string аргумент, объявлены explicit.

ПВ>>Например std::logic_error

RO>std::logic_error("hello world") и std::string("hello world") — одно и то же? Нет? Поэтому и explicit.

Не вижу какие неудобства могло бы повлечь отсутствие explicit.

например следующее
std::logic_error e = "error";
с толку не сбивает в отличие, как если бы было можно написать
std::vector<int> v = 10;

а при
string s("error");
throw s;
однозначно будет викинуто std::string
Re[3]: Explicit keyword - зачем?
От: HiSH Россия http://m0riarty.ya.ru
Дата: 09.05.06 21:37
Оценка:
Здравствуйте, Посторонним В., Вы писали:

ПВ>Здравствуйте, Roman Odaisky, Вы писали:


RO>>Здравствуйте, Посторонним В., Вы писали:


ПВ>>>Зачем в стандартных классах производных от std::exception конструкторы, имеющие string аргумент, объявлены explicit.

ПВ>>>Например std::logic_error

RO>>std::logic_error("hello world") и std::string("hello world") — одно и то же? Нет? Поэтому и explicit.

ПВ>Не вижу какие неудобства могло бы повлечь отсутствие explicit.

А какие удобства?

ПВ>например следующее

ПВ>std::logic_error e = "error";
ПВ>с толку не сбивает в отличие, как если бы было можно написать
ПВ>std::vector<int> v = 10;

Мы же не пишем SuperDbDriver db = "...ConnectionString..." — это нелогично. Драйвер — это не просто строка, а еще какие-то данные. Мы пишем SuperDbDriver db("...ConnectionString..."), Так же и с logic_error
Re[3]: Explicit keyword - зачем?
От: Roman Odaisky Украина  
Дата: 10.05.06 06:44
Оценка:
Здравствуйте, Посторонним В., Вы писали:

ПВ>а при

ПВ>string s("error");
ПВ>throw s;
ПВ>однозначно будет викинуто std::string

А при catch(std::logic_error const &) программа доложит о возникновении Logic Error, вот же в чем дело!

void f()
{
    ...
    if(cond)
        throw "The result is: " + s;
    ...
}

void g()
{
    try
    {
        ...
        f();
        ...
    }
    catch(std::runtime_error const& e)
    {
        std::cout << "Error!!!" << std::endl;
        std::exit(EXIT_FAILURE);
    }
}

void h()
{
    try
    {
        ...
        g();
        ...
    }
    catch(std::string const& res)
    {
        std::cout << "Gotcha!" << std::endl;
        std::cout << res << std::endl;
    }
}
До последнего не верил в пирамиду Лебедева.
Re: Explicit keyword - зачем?
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 10.05.06 06:51
Оценка: :))) :))
Здравствуйте, Посторонним В., Вы писали:

ПВ>Зачем в стандартных классах производных от std::exception конструкторы, имеющие string аргумент, объявлены explicit.

ПВ>Например std::logic_error

Это специальная приблуда для программистов пожилого возраста, которые во всем любят однозначность, определенность и очень раздражительно относятся к неявным вещам. К сожалению, STL проектировали именно такие люди.

Реальные хакеры explicit не используют.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[4]: Explicit keyword - зачем?
От: Посторонним В. Беларусь  
Дата: 10.05.06 08:03
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, Посторонним В., Вы писали:


ПВ>>а при

ПВ>>string s("error");
ПВ>>throw s;
ПВ>>однозначно будет викинуто std::string

RO>А при catch(std::logic_error const &) программа доложит о возникновении Logic Error, вот же в чем дело!


Хм, у меня следующий фрагмент печатает "string exception"
VC 7.1, console app, настройки по умолчанию


void f()
{
    std::string s;
    throw s;
}

int main()
{
    try
    {
        f();
    }
    catch (const std::logic_error &  e)
    {
        cout << "logic_error\n";
    }
    catch(const std::string & e)
    {
        std::cout << "string exception\n";
    }
}
Re[5]: Explicit keyword - зачем?
От: Посторонним В. Беларусь  
Дата: 10.05.06 08:14
Оценка:
Здравствуйте, Посторонним В., Вы писали:

ПВ>Здравствуйте, Roman Odaisky, Вы писали:


RO>>Здравствуйте, Посторонним В., Вы писали:


ПВ>>>а при

ПВ>>>string s("error");
ПВ>>>throw s;
ПВ>>>однозначно будет викинуто std::string

RO>>А при catch(std::logic_error const &) программа доложит о возникновении Logic Error, вот же в чем дело!


Извиняюсь, там вместо std::logic_error должно быть вроде

struct A
{
    A(const std::string& s){}
};

...

catch (const A &  e)
...



ПВ>Хм, у меня следующий фрагмент печатает "string exception"

ПВ>VC 7.1, console app, настройки по умолчанию


ПВ>
ПВ>void f()
ПВ>{
ПВ>    std::string s;
ПВ>    throw s;
ПВ>}

ПВ>int main()
ПВ>{
ПВ>    try
ПВ>    {
ПВ>        f();
ПВ>    }
ПВ>    catch (const std::logic_error &  e)
ПВ>    {
ПВ>        cout << "logic_error\n";
ПВ>    }
ПВ>    catch(const std::string & e)
ПВ>    {
ПВ>        std::cout << "string exception\n";
ПВ>    }
ПВ>}
ПВ>
Re[2]: Explicit keyword - зачем?
От: Cheburek Россия  
Дата: 10.05.06 19:15
Оценка: :)
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Здравствуйте, Посторонним В., Вы писали:


ПВ>>Зачем в стандартных классах производных от std::exception конструкторы, имеющие string аргумент, объявлены explicit.

ПВ>>Например std::logic_error

КД>Это специальная приблуда для программистов пожилого возраста, которые во всем любят однозначность, определенность и очень раздражительно относятся к неявным вещам. К сожалению, STL проектировали именно такие люди.


КД>Реальные хакеры explicit не используют

скоко умных слов .

Не знаю насчёт пожилого возраста, но explicit используется для следующих вещей. Допустим у вас есть класс А с конструктором A(int v):

class A{
public:
    A();
    A(int v);
//...
}

теперь у нас есть некая функция func(A a);
теперь если мы вызовем её так:
func(10);

то компилятор всё проглотит и в результате будет сформирован код
func(A(10));

таким образом будет неявное преобразование из int в A. если вы не хотите по каким-то причинам допускат таких неявных преобразований, то пишите так:
class A{
public:
    A();
    explicit A(int v);
//...
}

вот собственно и всё.
http://gzip.rsdn.org/tools/member.aspx?id=cheburek
Re[3]: Explicit keyword - зачем?
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 11.05.06 04:27
Оценка:
Здравствуйте, Cheburek, Вы писали:

ПВ>>>Зачем в стандартных классах производных от std::exception конструкторы, имеющие string аргумент, объявлены explicit.


КД>>Это специальная приблуда для программистов пожилого возраста...


КД>>Реальные хакеры explicit не используют


C>скоко умных слов .


C>Не знаю насчёт пожилого возраста, но explicit используется для следующих вещей....


C>вот собственно и всё.


Зачот, студент
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.