Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > ("STRING" == str)


Автор: Alek86 12.2.2008, 15:31
Код

#include <iostream>
#include <string>

int main() {
  std::string str = "String";
  if ("STRING" == str)
    std::cout << "Strings are equal" << std::endl;
}


не знаю как найти, из-за чего тут нет ошибки?

Добавлено через 1 минуту и 25 секунд
компиляции

Автор: Fazil6 12.2.2008, 15:37
из-за того, что operator == реализован не в виде члена класса std::string, а свободной функцией и в этом случае к левому операнду можно применять приведение и так как существует конструктор с параметром const char* левый операнд приводится к std::string и работает оператор сравнения для строк.
Короче потому, что operator == не член класса.

Добавлено через 1 минуту и 43 секунды
 smile мне этот вопрос в браинбенче тоже попался

Автор: Alek86 12.2.2008, 15:43
хех, я чето думал, конструктор преобразования у basic_string explicit

тогда еще вопрос - он не explicit именно задля ("STRING" == str)? Или по другим причинам?

Автор: Fazil6 12.2.2008, 15:50
Цитата(Alek86 @  12.2.2008,  14:43 Найти цитируемый пост)
хех, я чето думал, конструктор преобразования у basic_string explicit

не совсем въехал причем здесь expicit...
используется вот этот конструктор
Код

basic_string(
   const value_type* _Ptr, 
   const allocator_type& _Al = Allocator ( )
); 

и , чесно говоря не вижу смысла иметь его  expicit , ибо по идее он должен работать как для const char* так и для char* и для строковых литералов, кои вообще являются массивами

Добавлено через 1 минуту и 17 секунд
Цитата(Alek86 @  12.2.2008,  14:43 Найти цитируемый пост)
тогда еще вопрос - он не explicit именно задля ("STRING" == str)? Или по другим причинам?

нет.
он для 
Код

std::string str("bla-bla");

Автор: Alek86 12.2.2008, 16:50
Цитата(Fazil6 @  12.2.2008,  15:50 Найти цитируемый пост)
не совсем въехал причем здесь expicit...

насколько я помню, то explicit делается потому же, из-за чего не рекомендуются операторы каста

Цитата(Fazil6 @  12.2.2008,  15:50 Найти цитируемый пост)

он для
код C++
1: std::string str("bla-bla");


разве при explicit эта конструкция не будет работать?
не будет работать
Код

std::string str = "bla-bla";


Автор: Fazil6 12.2.2008, 18:35
Цитата(Alek86 @  12.2.2008,  15:50 Найти цитируемый пост)
разве при explicit эта конструкция не будет работать?

не будет  smile 
Код

#include <iostream>
class A
{
public:
    
    A(const char *){ std::cout << "A::A()\n"; }
    A& operator=(const char *){ std::cout << "O::A()\n"; } 
    
};


void main(void)
{
    A a = "bla=bla";

}

если запустить, то как и ожидалось получим вызов конструктора с параметром, а если сделать этот конструктор explicit , то не скомпилится, т.к. всетаки нужно приведение типа от типа литерала (const char[8]) к const char*

Автор: Alek86 12.2.2008, 18:55
помойму ты что-то путаешь...
explicit не может САМ вызываться неявно, а не "не может допускать неявное приведение типа в своем параметре"

именно потому его и рекомендуют почаще тыкать

Автор: Fazil6 12.2.2008, 19:08
Цитата(Alek86 @  12.2.2008,  17:55 Найти цитируемый пост)
помойму ты что-то путаешь...explicit не может САМ вызываться неявно, а не "не может допускать неявное приведение типа в своем параметре"

сори, я неправильно понял твою мысль. 
Цитата(Alek86 @  12.2.2008,  15:50 Найти цитируемый пост)
разве при explicit эта конструкция не будет работать?не будет работать

Ты прав, я просто не то имел в виду.
Ведь если имеем код
Код

void f(const std::string &)
{
/**/
}

то абсолютно привычно вызвать ее, например вот так
Код

f("bla-bla");

это я и мел в виду, поэтому мне удивительно почему ты вспомнил про explicit применительно к operator==...

Автор: Alek86 12.2.2008, 19:10
Цитата(Fazil6 @  12.2.2008,  19:08 Найти цитируемый пост)
 поэтому мне удивительно почему ты вспомнил про explicit применительно к operator==...

не к тому применительно
просто казалось, что если это уж такое "правило" - ставить explicit у конструкторов преобразования, то у basic_string он уж точно таков smile
оказалось, что не тут то было...

Автор: Fazil6 12.2.2008, 19:19
Цитата(Alek86 @  12.2.2008,  18:10 Найти цитируемый пост)
просто казалось, что если это уж такое "правило" - ставить explicit у конструкторов преобразования, то у basic_string он уж точно таков 

ну ты же понимаешь, что правило правилом, но до маразма тоже доводить не нужно. Преобразование char* -> std::string вполне логично и запрещать неявное преобразование в таком случае смысла , я например, не вижу

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)