неявное преобразование char* в string - это плохо?
От: greenloki  
Дата: 02.05.06 10:14
Оценка:
допустим первый вариант:
vector<string> v;
v.push_back("str");


почему первый вариант считается правильным и даже предпочтительным, а не например более правильный и более осмысленный (нет неявного преобразования char* в string) с моей точки зрения второй вариант?:
vector<string> v;
v.push_back(string("str"));


из той же оперы что и первый вариант:
string foo()
{
    return "str";
}


существуют ли контейнеры отличные от std::string которые могут работать только со вторым вариантом или оба этих варианта это просто синонимы?
Re: неявное преобразование char* в string - это плохо?
От: Аноним  
Дата: 02.05.06 10:32
Оценка:
Двойной вызов конструктора ?
Re: неявное преобразование char* в string - это плохо?
От: rg45 СССР  
Дата: 02.05.06 10:38
Оценка:
"greenloki" <53992@users.rsdn.ru> wrote in message news:1876206@news.rsdn.ru...
> допустим первый вариант:
>
> vector<string> v;
> v.push_back("str");
>

>
> почему первый вариант считается правильным и даже предпочтительным, а не например более правильный и более осмысленный (нет неявного преобразования char* в string) с моей точки зрения второй вариант?:
>
> vector<string> v;
> v.push_back(string("str"));
>

>
> из той же оперы что и первый вариант:
>
> string foo()
> {
> return "str";
> }
>

>
> существуют ли контейнеры отличные от std::string которые могут работать только со вторым вариантом или оба этих варианта это просто синонимы?

Неявные преобразования обычно запрещают для повышения безопасности там, где они чреваты какми-либо неприятностями. Например, запрещено неявное конструирование boost::shared_ptr по голому указателю, т.к. можно случайно сконструировать указатель на объект, который не был создан с пом. оператора new и незаметиь этого. Конструирование std::string по const char* является частой и естественной операцией, совершенно безопасной, и нет оснований запрещать неявное конструирование.
Posted via RSDN NNTP Server 2.0
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: неявное преобразование char* в string - это плохо?
От: MuTPu4  
Дата: 02.05.06 11:34
Оценка: +1
Здравствуйте, <Аноним>, Вы писали:

А>Двойной вызов конструктора ?

В обоих случаях может создаваться временный объект, но (5.2.2/4)

During the initialization of a parameter, an implementation may avoid the construction of extra temporaries by combining the conversions on the associated argument and/or the construction of temporaries with the initialization of the parameter

Ни на одном моем компиляторе мне не удалось добиться конструирования лишнего объекта как при передачи по значению, так и по ссылке.

ИМХО если конструктор не объявлен как explicit, то использование неявных преобразований предполагалось автором класса, так что в этом нет ничего "неправильного".
Re[3]: неявное преобразование char* в string - это плохо?
От: IvnAR Россия  
Дата: 02.05.06 14:09
Оценка:
Здравствуйте, MuTPu4, Вы писали:

А>>Двойной вызов конструктора ?

MTP>В обоих случаях может создаваться временный объект, но (5.2.2/4)
MTP>

MTP>During the initialization of a parameter, an implementation may avoid the construction of extra temporaries by combining the conversions on the associated argument and/or the construction of temporaries with the initialization of the parameter

MTP>Ни на одном моем компиляторе мне не удалось добиться конструирования лишнего объекта как при передачи по значению, так и по ссылке.
На 6-7 визуале генерируемый код для обоих случаев одинаков и везде в push_back передается временнный объект string(раз конструктор) + в push_back-е — конструктор копирования! итого 2 (или я вас неправильно понял?)
Re[4]: неявное преобразование char* в string - это плохо?
От: MuTPu4  
Дата: 02.05.06 14:38
Оценка:
Здравствуйте, IvnAR, Вы писали:

IAR>На 6-7 визуале генерируемый код для обоих случаев одинаков и везде в push_back передается временнный объект string(раз конструктор) + в push_back-е — конструктор копирования! итого 2 (или я вас неправильно понял?)

Из визуалов я использую версию 7.1. На простом тесте (передача параметра в свою функцию) все лишние временные объекты были элиминированы, т.е. параметр функции был непосредственно проинициализирован.
Для исходного примера с вектором не совсем ясно как интепретировать результаты. Реализация имеет право копировать переданный объект столько раз, сколько посчитает нужным. Например, в случае VC 7.1 в коде push_back содержаться еще косвенные вызовы. В любом случае, явное и неявное преобразования дали у меня одинаковый результат — создано 3 объекта, так что разницы, опять же, никакой.
Re[2]: неявное преобразование char* в string - это плохо?
От: rg45 СССР  
Дата: 02.05.06 14:57
Оценка:
" Аноним " <0@users.rsdn.ru> wrote in message news:1876244@news.rsdn.ru...
> Двойной вызов конструктора ?

По количеству конструкторов эти два примера совершенно эквивалентны. Разница только лишь в том, что в первом случае конструктор вызывается неявно а во втором — явно.
Posted via RSDN NNTP Server 2.0
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[5]: неявное преобразование char* в string - это плохо?
От: IvnAR Россия  
Дата: 02.05.06 15:02
Оценка:
Здравствуйте, MuTPu4, Вы писали:

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


IAR>>На 6-7 визуале генерируемый код для обоих случаев одинаков и везде в push_back передается временнный объект string(раз конструктор) + в push_back-е — конструктор копирования! итого 2 (или я вас неправильно понял?)

MTP>Из визуалов я использую версию 7.1. На простом тесте (передача параметра в свою функцию) все лишние временные объекты были элиминированы, т.е. параметр функции был непосредственно проинициализирован.
MTP>Для исходного примера с вектором не совсем ясно как интепретировать результаты. Реализация имеет право копировать переданный объект столько раз, сколько посчитает нужным. Например, в случае VC 7.1 в коде push_back содержаться еще косвенные вызовы. В любом случае, явное и неявное преобразования дали у меня одинаковый результат — создано 3 объекта, так что разницы, опять же, никакой.
Да разницы нет; а что за 3-й объект — у меня 2(я их уже перечислял)(Правда StlPort)
Re: неявное преобразование char* в string - это плохо?
От: _Winnie Россия C++.freerun
Дата: 02.05.06 21:16
Оценка:
В ходе поддержки _разных_ приложений _несколько_ раз сталкивался с тем, что возвращали false так —

std::string GetFileName()
{
char some_buf[100];
if (SomeOsAPIFunction(some_buf, 100))
return some_buf;
else
[b]return false; <------------------- !!!!!!!!!!

}
[/b]
Правильно работающая программа — просто частный случай Undefined Behavior
Re: неявное преобразование char* в string - это плохо?
От: _Winnie Россия C++.freerun
Дата: 02.05.06 21:19
Оценка: :)
Здравствуйте, greenloki, Вы писали:

В ходе поддержки _разных_ приложений _несколько_ раз сталкивался с тем, что возвращали инициализировали std::string нулём или false, например так —

std::string GetFileName()
{
  char some_buf[100];
  if (SomeOsAPIFunction(some_buf, 100))
    return some_buf;
  else
    return false; <------------------- !!!!!!!!!!
}
Правильно работающая программа — просто частный случай Undefined Behavior
Re[2]: неявное преобразование char* в string - это плохо?
От: khap Россия https://khorost.net
Дата: 03.05.06 09:38
Оценка:
Hello _Winnie,

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


_> В ходе поддержки _разных_ приложений _несколько_ раз сталкивался с

_> тем, что возвращали инициализировали std::string нулём или false,
_> например так -

_>
_> std::string GetFileName()
_> {
_> char some_buf[100];
_> if (SomeOsAPIFunction(some_buf, 100))
_> return some_buf;
_> else
_> return false; <------------------- !!!!!!!!!!
_> }
_>


Вполне реальная ситуация , хотя и некорректно решенная.
Без использования std::string можно было сделать так:

const char* GetFileName()
{
char some_buf[100];
if (SomeOsAPIFunction(some_buf, 100))
return some_buf;
else
return NULL;
}


А как сделать такой же функционал с std::string GetFileName() ?

Возвращать пустую строку неверно, т.к. это может быть вполне корректным значением.

Бросать exception?

WBR,
Alexander Khokhlov
Posted via RSDN NNTP Server 2.0
Re[3]: неявное преобразование char* в string - это плохо?
От: ekamaloff Великобритания  
Дата: 03.05.06 09:53
Оценка: 4 (1)
Здравствуйте, khap, Вы писали:

K>А как сделать такой же функционал с std::string GetFileName() ?


K>Возвращать пустую строку неверно, т.к. это может быть вполне корректным значением.


bool GetFileName(std::string& s);


K>Бросать exception?


Как нравится
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[3]: неявное преобразование char* в string - это плохо?
От: Centaur Россия  
Дата: 03.05.06 14:58
Оценка: 4 (1)
Здравствуйте, khap, Вы писали:

K>А как сделать такой же функционал с std::string GetFileName() ?


K>Возвращать пустую строку неверно, т.к. это может быть вполне корректным значением.


boost::optional<std::string>?
Re[2]: неявное преобразование char* в string - это плохо?
От: greenloki  
Дата: 04.05.06 00:50
Оценка:
_W>В ходе поддержки _разных_ приложений _несколько_ раз сталкивался с тем, что возвращали инициализировали std::string нулём или false, например так —
почему компилятор не отлавливает такие гадости?
Re[3]: неявное преобразование char* в string - это плохо?
От: greenloki  
Дата: 04.05.06 00:54
Оценка:
MTP>ИМХО если конструктор не объявлен как explicit, то использование неявных преобразований предполагалось автором класса, так что в этом нет ничего "неправильного".
хорошо, то что код на выходе будет одинаковый это понятно, а читаемость? стиль кода? в c++ столько подразумеваемых действий, что лишних совсем не хочется плодить, ладно я, но если код без явного вызова конструктора увидит адепт другого языка у него уши в трубочку могут свернутся
Re[3]: неявное преобразование char* в string - это плохо?
От: _Winnie Россия C++.freerun
Дата: 04.05.06 06:11
Оценка:
Здравствуйте, greenloki, Вы писали:

_W>>В ходе поддержки _разных_ приложений _несколько_ раз сталкивался с тем, что возвращали инициализировали std::string нулём или false, например так —

G>почему компилятор не отлавливает такие гадости?
Именно за неявного преобразвания false в (char*)NULL
Правильно работающая программа — просто частный случай Undefined Behavior
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.